mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-25 10:49:41 +01:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2a7a497d3a | ||
|
|
4321d03d52 |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1 +0,0 @@
|
||||
* -text
|
||||
8
.hgtags
8
.hgtags
@@ -633,11 +633,3 @@ e41ae00add1d76a8f25adb558933382947ea840d jdk-11.0.11+6
|
||||
9f0347b029d3a0349f23befcfb68ee02d85d9034 jdk-11.0.11+8
|
||||
15862747ee15445292b4b9949b4f0f4badba4812 jdk-11.0.11+9
|
||||
15862747ee15445292b4b9949b4f0f4badba4812 jdk-11.0.11-ga
|
||||
5720ffa08f8514b9f0ea8b3a49e05a872c9c0efe jdk-11.0.12+1
|
||||
70a4031a8bef3e693f34864fdd482429c73dc76a jdk-11.0.12+2
|
||||
873a691b1ae4fa8b55ca5d08fa21aca3a4904fb8 jdk-11.0.12+3
|
||||
40d1e784e1937aaea696a9654cc2d944d3d78996 jdk-11.0.12+4
|
||||
6aa6f6860508fca3a97aea1de7a36574498d22bf jdk-11.0.12+5
|
||||
91e81ac088545abdc3eaaa707853d31a6cf99af3 jdk-11.0.12+6
|
||||
f412f2537f1502a9697a9684c77bea8d848db1ab jdk-11.0.12+7
|
||||
f412f2537f1502a9697a9684c77bea8d848db1ab jdk-11.0.12-ga
|
||||
|
||||
171
README.md
171
README.md
@@ -1,171 +1,84 @@
|
||||
[](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub)
|
||||
|
||||
# Welcome to JetBrains Runtime!
|
||||
# How JetBrains Runtime is organised
|
||||
## Workspaces
|
||||
|
||||
JetBrains Runtime is a fork of [OpenJDK](https://github.com/openjdk/jdk) available for Windows, Mac OS X, and Linux.
|
||||
It includes a number enhancements in font rendering, HiDPI support, ligatures, performance improvements, and bugfixes.
|
||||
[github.com/JetBrains/JetBrainsRuntime](https://github.com/JetBrains/JetBrainsRuntime)
|
||||
|
||||
## Releases
|
||||
Download the latest releases of JetBrains Runtime to use with JetBrains IDEs. The full list
|
||||
can be found on the [releases page](https://github.com/JetBrains/JetBrainsRuntime/releases).
|
||||
|
||||
| IDE Version | Latest JBR | Date Released |
|
||||
| --- | --- | --- |
|
||||
| 2021.3 | [11_0_12-b1751.11](https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jbr11_0_12b1751.11) | 21-Oct-2021 |
|
||||
| 2021.2 | [11_0_12-b1504.40](https://github.com/JetBrains/JetBrainsRuntime/releases/tag/jb11_0_12-b1504.40) | 28-Sep-2021 |
|
||||
| 2021.1 | [11.0.11+9-b1341.60](https://confluence.jetbrains.com/pages/viewpage.action?pageId=218857477) | 15-Jun-2021 |
|
||||
| 2020.3 | [11_0_11-b1145.115](https://confluence.jetbrains.com/pages/viewpage.action?pageId=219349001) | 21-Jun-2021 |
|
||||
|
||||
## Contents
|
||||
- [Welcome to JetBrains Runtime](#jetbrains-runtime)
|
||||
- [Products Built on JetBrains Runtime](#products-built-on-jetbrains-runtime)
|
||||
- [Getting Sources](#getting-sources)
|
||||
- [macOS, Linux](#macos-linux)
|
||||
- [Windows](#sources-windows)
|
||||
- [Configuring the Build Environment](#configuring-the-build-environment)
|
||||
- [Linux (Docker)](#linux-docker)
|
||||
- [Ubuntu Linux](#ubuntu-linux)
|
||||
- [Windows](#build-windows)
|
||||
- [macOS](#macos)
|
||||
- [Developing](#developing)
|
||||
- [Contributing](#contributing)
|
||||
- [Resources](#resources)
|
||||
|
||||
## Products Built on JetBrains Runtime
|
||||
* [Android Studio](https://developer.android.com/studio). The official IDE for Google's Android operating system.
|
||||
* [CLion](https://www.jetbrains.com/clion/). A cross-platform IDE for C and C++ from JetBrains.
|
||||
* [DataGrip](https://www.jetbrains.com/datagrip/). The IDE for Databases and SQL from JetBrains.
|
||||
* [GoLand](https://www.jetbrains.com/go/). The cross-platform Go IDE from JetBrains.
|
||||
* [IntelliJ IDEA](https://www.jetbrains.com/idea/). The IDE for JVM from JetBrains.
|
||||
* [JProfiler](https://www.ej-technologies.com/products/jprofiler/overview.html). The Java profiler.
|
||||
* [PhpStorm](https://www.jetbrains.com/phpstorm/). The PHP IDE from JetBrains.
|
||||
* [PyCharm](https://www.jetbrains.com/pycharm/). The Python IDE from JetBrains.
|
||||
* [Rider](https://www.jetbrains.com/rider/). The cross-platform .NET IDE from JetBrains.
|
||||
* [RubyMine](https://www.jetbrains.com/ruby/). The Ruby and Rails IDE from JetBrains.
|
||||
* [WebStorm](https://www.jetbrains.com/webstorm/). The JavaScript IDE from JetBrains.
|
||||
* [YourKit](https://www.yourkit.com/). Java and .NET profilers.
|
||||
|
||||
## Getting Sources
|
||||
### macOS, Linux
|
||||
## Getting sources
|
||||
__macOS, Linux:__
|
||||
```
|
||||
git config --global core.autocrlf input
|
||||
git clone git@github.com:JetBrains/JetBrainsRuntime.git
|
||||
```
|
||||
|
||||
### Windows
|
||||
<a name="sources-windows"></a>
|
||||
__Windows:__
|
||||
```
|
||||
git config --global core.autocrlf false
|
||||
git clone git@github.com:JetBrains/JetBrainsRuntime.git
|
||||
```
|
||||
|
||||
## Configuring the Build Environment
|
||||
Here are quick per-platform instructions for those who can't wait to get started.
|
||||
Please refer to [OpenJDK build docs](http://hg.openjdk.java.net/jdk/jdk11/raw-file/tip/doc/building.html) for in-depth
|
||||
coverage of all the details.
|
||||
# Configure local build environment
|
||||
[OpenJDK build docs](http://hg.openjdk.java.net/jdk/jdk11/raw-file/tip/doc/building.html)
|
||||
Tip for all platforms: run `./configure` and check output.
|
||||
Usually, it has meaningful advice how to solve your problem.
|
||||
|
||||
> **_TIP:_** To get a preliminary report of what's missing, run `./configure` and check its output.
|
||||
> It would usually have a meaningful advice on how to solve the problem.
|
||||
|
||||
### Linux (Docker)
|
||||
Create a container:
|
||||
## Linux (Docker)
|
||||
```
|
||||
$ cd jb/project/docker
|
||||
$ docker build .
|
||||
...
|
||||
Successfully built 942ea9900054
|
||||
```
|
||||
Run these commands in the new container:
|
||||
```
|
||||
|
||||
$ docker run -v `pwd`../../../../:/JetBrainsRuntime -it 942ea9900054
|
||||
|
||||
# cd /JetBrainsRuntime
|
||||
# sh ./configure
|
||||
# make images CONF=linux-x86_64-normal-server-release
|
||||
```
|
||||
|
||||
### Ubuntu Linux
|
||||
Install the necessary tools, libraries, and headers with:
|
||||
```
|
||||
$ sudo apt-get install autoconf make build-essential libx11-dev libxext-dev libxrender-dev libxtst-dev \
|
||||
libxt-dev libxrandr-dev libcups2-dev libfontconfig1-dev libasound2-dev \
|
||||
openjdk-11-jdk
|
||||
```
|
||||
Then run the following:
|
||||
## Linux (Ubuntu 18.10 desktop)
|
||||
```
|
||||
$ sudo apt-get install autoconf make build-essential libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libxrandr-dev libcups2-dev libfontconfig1-dev libasound2-dev
|
||||
|
||||
$ cd JetBrainsRuntime
|
||||
$ sh ./configure --disable-warnings-as-errors
|
||||
$ make images
|
||||
```
|
||||
|
||||
### Windows
|
||||
<a name="build-windows"></a>
|
||||
Install the following:
|
||||
* [Cygwin x64](http://www.cygwin.com/).
|
||||
Required packages: `autoconf`, `binutils`, `cpio`, `diffutils`, `file`, `gawk`, `gcc-core`, `make`, `m4`, `unzip`, `zip`.
|
||||
Install those together with Cygwin.
|
||||
* [Visual Studio compiler toolset](https://visualstudio.microsoft.com/downloads/).
|
||||
Install with the desktop development kit, which includes Windows SDK and compilers.
|
||||
Visual Studio 2015 is supported by default.
|
||||
* [Java 11](https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html).
|
||||
If you have problems while configuring, read [Java tips on Cygwin](http://horstmann.com/articles/cygwin-tips.html).
|
||||
## Windows
|
||||
Install:
|
||||
* [Cygwin x64](http://www.cygwin.com/)
|
||||
Required packages: autoconf, binutils, cpio, diffutils, file, gawk, gcc-core, make, m4, unzip, zip.
|
||||
**Install them while installing Cygwin**.
|
||||
* Visual Studio compiler toolset [Download](https://visualstudio.microsoft.com/downloads/)
|
||||
Visual Studio 2015 has support by default.
|
||||
**Install with desktop development kit, it includes Windows SDK and compilers**.
|
||||
* [Java 11](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
|
||||
If you have problems while configuring [read Java tips on Cygwin](http://horstmann.com/articles/cygwin-tips.html)
|
||||
|
||||
From the command line:
|
||||
From command line:
|
||||
```
|
||||
"c:\Program Files (x86)\Microsoft Visual Studio 15.0\VC\vcvarsall.bat" amd64
|
||||
c:\cygwin64\bin\mintty.exe /usr/bin/bash -l
|
||||
"c:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
|
||||
"c:\Program_Files\cygwin64\bin\mintty.exe" /bin/bash -l
|
||||
```
|
||||
The first command sets up environment variables, the second starts a Cygwin shell with the proper environment.
|
||||
First command will set env vars, the second will run Cygwin shell with proper environment.
|
||||
|
||||
In the Cygwin shell:
|
||||
```
|
||||
$ cd JetBrainsRuntime
|
||||
$ bash configure --enable-option-checking=fatal --with-toolchain-version=2015 \
|
||||
--with-boot-jdk="/cygdrive/c/Program Files/Java/jdk-11.0.5" --disable-warnings-as-errors
|
||||
$ make images
|
||||
In Cygwin shell:
|
||||
```
|
||||
cd JetBrainsRuntime
|
||||
bash configure --enable-option-checking=fatal --with-toolchain-version=2015 --with-boot-jdk="/cygdrive/c/Program Files/Java/jdk-11.0.5" --disable-warnings-as-errors
|
||||
make images
|
||||
```
|
||||
|
||||
### macOS
|
||||
Install the following:
|
||||
* Xcode command line developer tools and `autoconf` via [Homebrew](getDpiInfo).
|
||||
* [Java 11](https://docs.aws.amazon.com/corretto/latest/corretto-11-ug/downloads-list.html).
|
||||
## macOS
|
||||
Install Xcode command line developer tools, autoconf (via Homebrew).
|
||||
|
||||
From the command line:
|
||||
Run:
|
||||
```
|
||||
$ cd JetBrainsRuntime
|
||||
$ sh ./configure --prefix=$(pwd)/build --disable-warnings-as-errors
|
||||
$ make images
|
||||
sh ./configure --prefix=$(pwd)/build --disable-warnings-as-errors
|
||||
make images
|
||||
```
|
||||
|
||||
## Developing
|
||||
You can use [CLion](https://www.jetbrains.com/clion/) to develop native parts of the JetBrains Runtime and
|
||||
[IntelliJ IDEA](https://www.jetbrains.com/idea/) for the parts written in Java.
|
||||
Both require projects to be created.
|
||||
|
||||
### CLion
|
||||
Run
|
||||
```
|
||||
$ make compile-commands
|
||||
```
|
||||
in the git root and open the resulting `build/.../compile_commands.json` file as a project.
|
||||
Then use `Tools | Compilation Database | Change Project Root` to point to git root of this repository.
|
||||
|
||||
See also this detailed step-by-step tutorial for all platforms:
|
||||
[How to develop OpenJDK with CLion](https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/).
|
||||
|
||||
### IDEA
|
||||
Run
|
||||
```
|
||||
$ sh ./bin/idea.sh
|
||||
```
|
||||
in the git root to generate project files (add `--help` for options). Then open the git root directory
|
||||
as a project in IDEA.
|
||||
|
||||
## Contributing
|
||||
We are happy to receive your pull requests!
|
||||
Before you submit one, please sign our [Contributor License Agreement (CLA)](https://www.jetbrains.com/agreements/cla/).
|
||||
|
||||
## Resources
|
||||
* [JetBrains Runtime on github](https://github.com/JetBrains/JetBrainsRuntime).
|
||||
* [OpenJDK build instructions](http://hg.openjdk.java.net/jdk/jdk11/raw-file/tip/doc/building.html).
|
||||
* [OpenJDK test instructions](http://hg.openjdk.java.net/jdk/jdk11/raw-file/tip/doc/building.html#running-tests).
|
||||
* [How to develop OpenJDK with CLion](https://blog.jetbrains.com/clion/2020/03/openjdk-with-clion/).
|
||||
## Contribution
|
||||
We will be happy to receive your pull requests. Before you submit one, please sign our Contributor License Agreement (CLA) https://www.jetbrains.com/agreements/cla/
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
# $1 - Boot JDK
|
||||
# $2 - JBR part of API version
|
||||
|
||||
cd "`dirname "$0"`/../../../../.."
|
||||
PWD="`pwd`"
|
||||
CONF="$PWD/build/jbr-api.conf"
|
||||
./configure --with-debug-level=release --with-boot-jdk=$1 || exit $?
|
||||
make jbr-api CONF=release MAKEOVERRIDES= "JBR_API_CONF_FILE=$CONF" JBR_API_JBR_VERSION=$2 || exit $?
|
||||
. $CONF || exit $?
|
||||
echo "##teamcity[buildNumber '$VERSION']"
|
||||
cp "$JAR" ./jbr-api-${VERSION}.jar || exit $?
|
||||
cp "$SOURCES_JAR" ./jbr-api-${VERSION}-sources.jar || exit $?
|
||||
echo "##teamcity[publishArtifacts '$PWD/jbr-api-${VERSION}.jar']"
|
||||
echo "##teamcity[publishArtifacts '$PWD/jbr-api-${VERSION}-sources.jar']"
|
||||
@@ -1,27 +0,0 @@
|
||||
diff --git modules.list modules.list
|
||||
index 33375b527c4..76539cbc0e0 100644
|
||||
--- modules.list
|
||||
+++ modules.list
|
||||
@@ -55,4 +55,5 @@ jdk.unsupported,
|
||||
jdk.xml.dom,
|
||||
jdk.zipfs,
|
||||
jdk.hotspot.agent,
|
||||
-jdk.jcmd
|
||||
+jdk.jcmd,
|
||||
+jcef
|
||||
diff --git src/java.desktop/share/classes/module-info.java src/java.desktop/share/classes/module-info.java
|
||||
index b663b382f52..3e9acdc0c27 100644
|
||||
--- src/java.desktop/share/classes/module-info.java
|
||||
+++ src/java.desktop/share/classes/module-info.java
|
||||
@@ -109,7 +109,10 @@ module java.desktop {
|
||||
// see make/GensrcModuleInfo.gmk
|
||||
exports sun.awt to
|
||||
jdk.accessibility,
|
||||
- jdk.unsupported.desktop;
|
||||
+ jdk.unsupported.desktop,
|
||||
+ jcef;
|
||||
+
|
||||
+ exports java.awt.peer to jcef;
|
||||
|
||||
exports java.awt.dnd.peer to jdk.unsupported.desktop;
|
||||
exports sun.awt.dnd to jdk.unsupported.desktop;
|
||||
@@ -1,7 +1,7 @@
|
||||
From d00ac9fa0f9a90fe52d93a5cab88d17638a0fb01 Mon Sep 17 00:00:00 2001
|
||||
From d75ca6d0d1799ffde4199f6ef5047699b98d3ff2 Mon Sep 17 00:00:00 2001
|
||||
From: skybber <lada.dvorak7@gmail.com>
|
||||
Date: Wed, 14 Nov 2018 21:09:39 +0100
|
||||
Subject: [PATCH 01/31] Apply basic dcevm11 patch
|
||||
Subject: [PATCH 01/18] Apply basic dcevm11 patch
|
||||
|
||||
---
|
||||
src/hotspot/share/ci/ciObjectFactory.cpp | 25 +
|
||||
@@ -126,7 +126,7 @@ index 1063c9853e1..3e9d48c4cdc 100644
|
||||
|
||||
#endif // SHARE_VM_CI_CIOBJECTFACTORY_HPP
|
||||
diff --git a/src/hotspot/share/classfile/classFileParser.cpp b/src/hotspot/share/classfile/classFileParser.cpp
|
||||
index 154dab55e43..0c6c3a86965 100644
|
||||
index 6d65cca2101..e2b8c5793d0 100644
|
||||
--- a/src/hotspot/share/classfile/classFileParser.cpp
|
||||
+++ b/src/hotspot/share/classfile/classFileParser.cpp
|
||||
@@ -954,6 +954,8 @@ void ClassFileParser::parse_interfaces(const ClassFileStream* const stream,
|
||||
@@ -236,10 +236,10 @@ index 3bdfd34e39f..d792ab4bb3f 100644
|
||||
ReferenceType reference_type() const { return _rt; }
|
||||
AccessFlags access_flags() const { return _access_flags; }
|
||||
diff --git a/src/hotspot/share/classfile/classLoader.cpp b/src/hotspot/share/classfile/classLoader.cpp
|
||||
index e10d32ea7b7..079558bb244 100644
|
||||
index 78eb096458a..368c59e2cbf 100644
|
||||
--- a/src/hotspot/share/classfile/classLoader.cpp
|
||||
+++ b/src/hotspot/share/classfile/classLoader.cpp
|
||||
@@ -1502,6 +1502,7 @@ InstanceKlass* ClassLoader::load_class(Symbol* name, bool search_append_only, TR
|
||||
@@ -1505,6 +1505,7 @@ InstanceKlass* ClassLoader::load_class(Symbol* name, bool search_append_only, TR
|
||||
protection_domain,
|
||||
NULL, // host_klass
|
||||
NULL, // cp_patches
|
||||
@@ -248,10 +248,10 @@ index e10d32ea7b7..079558bb244 100644
|
||||
if (HAS_PENDING_EXCEPTION) {
|
||||
if (DumpSharedSpaces) {
|
||||
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
index 5d9ac0009aa..e2754d5f5be 100644
|
||||
index c58026ae192..25103fff2c0 100644
|
||||
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
@@ -1245,6 +1245,12 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*)) {
|
||||
@@ -1242,6 +1242,12 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*)) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -264,7 +264,7 @@ index 5d9ac0009aa..e2754d5f5be 100644
|
||||
// Only walks the classes defined in this class loader.
|
||||
void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*, TRAPS), TRAPS) {
|
||||
Thread* thread = Thread::current();
|
||||
@@ -1254,6 +1260,12 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*, TRAPS),
|
||||
@@ -1251,6 +1257,12 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*, TRAPS),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -277,7 +277,7 @@ index 5d9ac0009aa..e2754d5f5be 100644
|
||||
// Walks all entries in the dictionary including entries initiated by this class loader.
|
||||
void ClassLoaderDataGraph::dictionary_all_entries_do(void f(InstanceKlass*, ClassLoaderData*)) {
|
||||
Thread* thread = Thread::current();
|
||||
@@ -1375,11 +1387,15 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
@@ -1372,11 +1384,15 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
// Mark metadata seen on the stack only so we can delete unneeded entries.
|
||||
// Only walk all metadata, including the expensive code cache walk, for Full GC
|
||||
// and only if class redefinition and if there's previous versions of
|
||||
@@ -294,7 +294,7 @@ index 5d9ac0009aa..e2754d5f5be 100644
|
||||
|
||||
// Save previous _unloading pointer for CMS which may add to unloading list before
|
||||
// purging and we don't want to rewalk the previously unloaded class loader data.
|
||||
@@ -1389,10 +1405,12 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
@@ -1386,10 +1402,12 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
while (data != NULL) {
|
||||
if (data->is_alive()) {
|
||||
// clean metaspace
|
||||
@@ -336,7 +336,7 @@ index f5157e07c76..e9e52f00e8a 100644
|
||||
|
||||
if (HAS_PENDING_EXCEPTION) {
|
||||
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
|
||||
index b949bac8de6..5bd048d8627 100644
|
||||
index 3ac1ca69ae5..118730f1b83 100644
|
||||
--- a/src/hotspot/share/classfile/dictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/dictionary.cpp
|
||||
@@ -245,6 +245,19 @@ void Dictionary::classes_do(void f(InstanceKlass*)) {
|
||||
@@ -449,10 +449,10 @@ index d26f1f11fb4..fd4b134d7a7 100644
|
||||
|
||||
// An entry in the class loader data dictionaries, this describes a class as
|
||||
diff --git a/src/hotspot/share/classfile/javaClasses.cpp b/src/hotspot/share/classfile/javaClasses.cpp
|
||||
index 559d90339be..b86f8320d70 100644
|
||||
index fc4efecc6e7..903979c9ef2 100644
|
||||
--- a/src/hotspot/share/classfile/javaClasses.cpp
|
||||
+++ b/src/hotspot/share/classfile/javaClasses.cpp
|
||||
@@ -2428,6 +2428,8 @@ void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHand
|
||||
@@ -2446,6 +2446,8 @@ void java_lang_Throwable::fill_in_stack_trace(Handle throwable, const methodHand
|
||||
skip_throwableInit_check = true;
|
||||
}
|
||||
}
|
||||
@@ -461,7 +461,7 @@ index 559d90339be..b86f8320d70 100644
|
||||
if (method->is_hidden()) {
|
||||
if (skip_hidden) continue;
|
||||
}
|
||||
@@ -3610,6 +3612,62 @@ void java_lang_invoke_DirectMethodHandle::serialize_offsets(SerializeClosure* f)
|
||||
@@ -3628,6 +3630,62 @@ void java_lang_invoke_DirectMethodHandle::serialize_offsets(SerializeClosure* f)
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -524,7 +524,7 @@ index 559d90339be..b86f8320d70 100644
|
||||
// Support for java_lang_invoke_MethodHandle
|
||||
|
||||
int java_lang_invoke_MethodHandle::_type_offset;
|
||||
@@ -3796,6 +3854,11 @@ void java_lang_invoke_ResolvedMethodName::set_vmtarget(oop resolved_method, Meth
|
||||
@@ -3814,6 +3872,11 @@ void java_lang_invoke_ResolvedMethodName::set_vmtarget(oop resolved_method, Meth
|
||||
resolved_method->address_field_put(_vmtarget_offset, (address)m);
|
||||
}
|
||||
|
||||
@@ -537,7 +537,7 @@ index 559d90339be..b86f8320d70 100644
|
||||
// lookup ResolvedMethod oop in the table, or create a new one and intern it
|
||||
oop resolved_method = ResolvedMethodTable::find_method(m());
|
||||
diff --git a/src/hotspot/share/classfile/javaClasses.hpp b/src/hotspot/share/classfile/javaClasses.hpp
|
||||
index 97df4a0bdea..2e121e19f19 100644
|
||||
index bd9cdca3fe3..da004d1b307 100644
|
||||
--- a/src/hotspot/share/classfile/javaClasses.hpp
|
||||
+++ b/src/hotspot/share/classfile/javaClasses.hpp
|
||||
@@ -67,6 +67,8 @@
|
||||
@@ -561,7 +561,7 @@ index 97df4a0bdea..2e121e19f19 100644
|
||||
static void allocate_fixup_lists();
|
||||
static void compute_offsets();
|
||||
|
||||
@@ -1048,6 +1050,55 @@ class java_lang_invoke_DirectMethodHandle: AllStatic {
|
||||
@@ -1055,6 +1057,55 @@ class java_lang_invoke_DirectMethodHandle: AllStatic {
|
||||
static int member_offset_in_bytes() { return _member_offset; }
|
||||
};
|
||||
|
||||
@@ -617,7 +617,7 @@ index 97df4a0bdea..2e121e19f19 100644
|
||||
// Interface to java.lang.invoke.LambdaForm objects
|
||||
// (These are a private interface for managing adapter code generation.)
|
||||
|
||||
@@ -1099,6 +1150,7 @@ class java_lang_invoke_ResolvedMethodName : AllStatic {
|
||||
@@ -1106,6 +1157,7 @@ class java_lang_invoke_ResolvedMethodName : AllStatic {
|
||||
|
||||
static Method* vmtarget(oop resolved_method);
|
||||
static void set_vmtarget(oop resolved_method, Method* method);
|
||||
@@ -732,7 +732,7 @@ index 8a7a1248e62..611e18aaf85 100644
|
||||
bool add_entry(Symbol* name, InstanceKlass* klass1, Handle loader1,
|
||||
InstanceKlass* klass2, Handle loader2);
|
||||
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
index 4509025cf70..1ab9b99b435 100644
|
||||
index bfd67334f82..5a745b6fca6 100644
|
||||
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
@@ -201,6 +201,7 @@ Klass* SystemDictionary::resolve_or_fail(Symbol* class_name, Handle class_loader
|
||||
@@ -824,7 +824,7 @@ index 4509025cf70..1ab9b99b435 100644
|
||||
} );
|
||||
|
||||
return k;
|
||||
@@ -1555,11 +1568,12 @@ static void post_class_define_event(InstanceKlass* k, const ClassLoaderData* def
|
||||
@@ -1553,11 +1566,12 @@ static void post_class_define_event(InstanceKlass* k, const ClassLoaderData* def
|
||||
}
|
||||
}
|
||||
|
||||
@@ -838,7 +838,7 @@ index 4509025cf70..1ab9b99b435 100644
|
||||
|
||||
// for bootstrap and other parallel classloaders don't acquire lock,
|
||||
// use placeholder token
|
||||
@@ -1584,7 +1598,11 @@ void SystemDictionary::define_instance_class(InstanceKlass* k, TRAPS) {
|
||||
@@ -1582,7 +1596,11 @@ void SystemDictionary::define_instance_class(InstanceKlass* k, TRAPS) {
|
||||
Symbol* name_h = k->name();
|
||||
Dictionary* dictionary = loader_data->dictionary();
|
||||
unsigned int d_hash = dictionary->compute_hash(name_h);
|
||||
@@ -851,7 +851,7 @@ index 4509025cf70..1ab9b99b435 100644
|
||||
|
||||
// Register class just loaded with class loader (placed in Vector)
|
||||
// Note we do this before updating the dictionary, as this can
|
||||
@@ -1618,7 +1636,7 @@ void SystemDictionary::define_instance_class(InstanceKlass* k, TRAPS) {
|
||||
@@ -1616,7 +1634,7 @@ void SystemDictionary::define_instance_class(InstanceKlass* k, TRAPS) {
|
||||
k->eager_initialize(THREAD);
|
||||
|
||||
// notify jvmti
|
||||
@@ -860,7 +860,7 @@ index 4509025cf70..1ab9b99b435 100644
|
||||
assert(THREAD->is_Java_thread(), "thread->is_Java_thread()");
|
||||
JvmtiExport::post_class_load((JavaThread *) THREAD, k);
|
||||
|
||||
@@ -1696,7 +1714,7 @@ InstanceKlass* SystemDictionary::find_or_define_instance_class(Symbol* class_nam
|
||||
@@ -1694,7 +1712,7 @@ InstanceKlass* SystemDictionary::find_or_define_instance_class(Symbol* class_nam
|
||||
}
|
||||
}
|
||||
|
||||
@@ -869,7 +869,7 @@ index 4509025cf70..1ab9b99b435 100644
|
||||
|
||||
Handle linkage_exception = Handle(); // null handle
|
||||
|
||||
@@ -1819,6 +1837,18 @@ void SystemDictionary::add_to_hierarchy(InstanceKlass* k, TRAPS) {
|
||||
@@ -1817,6 +1835,18 @@ void SystemDictionary::add_to_hierarchy(InstanceKlass* k, TRAPS) {
|
||||
CodeCache::flush_dependents_on(k);
|
||||
}
|
||||
|
||||
@@ -888,7 +888,7 @@ index 4509025cf70..1ab9b99b435 100644
|
||||
// ----------------------------------------------------------------------------
|
||||
// GC support
|
||||
|
||||
@@ -2115,7 +2145,7 @@ void SystemDictionary::check_constraints(unsigned int d_hash,
|
||||
@@ -2113,7 +2143,7 @@ void SystemDictionary::check_constraints(unsigned int d_hash,
|
||||
// also hold array classes.
|
||||
|
||||
assert(check->is_instance_klass(), "noninstance in systemdictionary");
|
||||
@@ -898,7 +898,7 @@ index 4509025cf70..1ab9b99b435 100644
|
||||
ss.print("loader %s", loader_data->loader_name_and_id());
|
||||
ss.print(" attempted duplicate %s definition for %s. (%s)",
|
||||
diff --git a/src/hotspot/share/classfile/systemDictionary.hpp b/src/hotspot/share/classfile/systemDictionary.hpp
|
||||
index a14728df757..b956c6a7519 100644
|
||||
index 649b321a6a4..06f6c869d63 100644
|
||||
--- a/src/hotspot/share/classfile/systemDictionary.hpp
|
||||
+++ b/src/hotspot/share/classfile/systemDictionary.hpp
|
||||
@@ -161,6 +161,8 @@ class OopStorage;
|
||||
@@ -910,7 +910,7 @@ index a14728df757..b956c6a7519 100644
|
||||
do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre ) \
|
||||
do_klass(VarHandle_klass, java_lang_invoke_VarHandle, Pre ) \
|
||||
do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre ) \
|
||||
@@ -321,6 +323,7 @@ public:
|
||||
@@ -318,6 +320,7 @@ public:
|
||||
Handle class_loader,
|
||||
Handle protection_domain,
|
||||
ClassFileStream* st,
|
||||
@@ -918,7 +918,7 @@ index a14728df757..b956c6a7519 100644
|
||||
TRAPS);
|
||||
|
||||
// Lookup an already loaded class. If not found NULL is returned.
|
||||
@@ -465,6 +468,10 @@ public:
|
||||
@@ -462,6 +465,10 @@ public:
|
||||
static bool is_well_known_klass(Symbol* class_name);
|
||||
#endif
|
||||
|
||||
@@ -929,7 +929,7 @@ index a14728df757..b956c6a7519 100644
|
||||
protected:
|
||||
// Returns the class loader data to be used when looking up/updating the
|
||||
// system dictionary.
|
||||
@@ -658,7 +665,7 @@ protected:
|
||||
@@ -655,7 +662,7 @@ protected:
|
||||
// after waiting, but before reentering SystemDictionary_lock
|
||||
// to preserve lock order semantics.
|
||||
static void double_lock_wait(Handle lockObject, TRAPS);
|
||||
@@ -977,10 +977,10 @@ index 05239c57866..c1357bde0ed 100644
|
||||
methodHandle _method; // current method being verified
|
||||
VerificationType _this_type; // the verification type of the current class
|
||||
diff --git a/src/hotspot/share/classfile/vmSymbols.hpp b/src/hotspot/share/classfile/vmSymbols.hpp
|
||||
index cef3f530cbc..17f7e720c95 100644
|
||||
index 44cf2583eb9..41e9a84cd69 100644
|
||||
--- a/src/hotspot/share/classfile/vmSymbols.hpp
|
||||
+++ b/src/hotspot/share/classfile/vmSymbols.hpp
|
||||
@@ -287,6 +287,8 @@
|
||||
@@ -286,6 +286,8 @@
|
||||
template(java_lang_invoke_CallSite, "java/lang/invoke/CallSite") \
|
||||
template(java_lang_invoke_ConstantCallSite, "java/lang/invoke/ConstantCallSite") \
|
||||
template(java_lang_invoke_DirectMethodHandle, "java/lang/invoke/DirectMethodHandle") \
|
||||
@@ -989,7 +989,7 @@ index cef3f530cbc..17f7e720c95 100644
|
||||
template(java_lang_invoke_MutableCallSite, "java/lang/invoke/MutableCallSite") \
|
||||
template(java_lang_invoke_VolatileCallSite, "java/lang/invoke/VolatileCallSite") \
|
||||
template(java_lang_invoke_MethodHandle, "java/lang/invoke/MethodHandle") \
|
||||
@@ -447,6 +449,12 @@
|
||||
@@ -446,6 +448,12 @@
|
||||
template(module_entry_name, "module_entry") \
|
||||
template(resolved_references_name, "<resolved_references>") \
|
||||
template(init_lock_name, "<init_lock>") \
|
||||
@@ -1684,10 +1684,10 @@ index 81998728f66..b9ccdee8cca 100644
|
||||
}
|
||||
}
|
||||
diff --git a/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp b/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp
|
||||
index 6cf7aec68f8..61a406377ee 100644
|
||||
index 77c28924b0d..84891b48c2a 100644
|
||||
--- a/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp
|
||||
+++ b/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp
|
||||
@@ -1471,6 +1471,7 @@ static InstanceKlass* create_new_instance_klass(InstanceKlass* ik, ClassFileStre
|
||||
@@ -1467,6 +1467,7 @@ static InstanceKlass* create_new_instance_klass(InstanceKlass* ik, ClassFileStre
|
||||
NULL, // host klass
|
||||
NULL, // cp_patches
|
||||
ClassFileParser::INTERNAL, // internal visibility
|
||||
@@ -2186,10 +2186,10 @@ index b77a19deb38..5573b10f021 100644
|
||||
// Compiler support
|
||||
static ByteSize super_offset() { return in_ByteSize(offset_of(Klass, _super)); }
|
||||
diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp
|
||||
index 576da96ed32..e47dd223f92 100644
|
||||
index 916772c0b10..ed6f769bf1b 100644
|
||||
--- a/src/hotspot/share/oops/method.cpp
|
||||
+++ b/src/hotspot/share/oops/method.cpp
|
||||
@@ -1447,6 +1447,8 @@ methodHandle Method::clone_with_new_data(const methodHandle& m, u_char* new_code
|
||||
@@ -1402,6 +1402,8 @@ methodHandle Method::clone_with_new_data(const methodHandle& m, u_char* new_code
|
||||
|
||||
// Reset correct method/const method, method size, and parameter info
|
||||
newm->set_constMethod(newcm);
|
||||
@@ -2198,7 +2198,7 @@ index 576da96ed32..e47dd223f92 100644
|
||||
newm->constMethod()->set_code_size(new_code_length);
|
||||
newm->constMethod()->set_constMethod_size(new_const_method_size);
|
||||
assert(newm->code_size() == new_code_length, "check");
|
||||
@@ -2141,6 +2143,10 @@ void Method::ensure_jmethod_ids(ClassLoaderData* loader_data, int capacity) {
|
||||
@@ -2096,6 +2098,10 @@ void Method::ensure_jmethod_ids(ClassLoaderData* loader_data, int capacity) {
|
||||
|
||||
// Add a method id to the jmethod_ids
|
||||
jmethodID Method::make_jmethod_id(ClassLoaderData* loader_data, Method* m) {
|
||||
@@ -2210,7 +2210,7 @@ index 576da96ed32..e47dd223f92 100644
|
||||
|
||||
if (!SafepointSynchronize::is_at_safepoint()) {
|
||||
diff --git a/src/hotspot/share/oops/method.hpp b/src/hotspot/share/oops/method.hpp
|
||||
index da8468dead4..4ac3e6e80de 100644
|
||||
index 18c706187df..4533476ff8f 100644
|
||||
--- a/src/hotspot/share/oops/method.hpp
|
||||
+++ b/src/hotspot/share/oops/method.hpp
|
||||
@@ -78,6 +78,9 @@ class Method : public Metadata {
|
||||
@@ -2248,7 +2248,7 @@ index da8468dead4..4ac3e6e80de 100644
|
||||
Symbol* signature() const { return constants()->symbol_at(signature_index()); }
|
||||
int signature_index() const { return constMethod()->signature_index(); }
|
||||
diff --git a/src/hotspot/share/prims/jni.cpp b/src/hotspot/share/prims/jni.cpp
|
||||
index f5db74f4225..7f88297aa10 100644
|
||||
index 21e7f652652..e9cc3de9652 100644
|
||||
--- a/src/hotspot/share/prims/jni.cpp
|
||||
+++ b/src/hotspot/share/prims/jni.cpp
|
||||
@@ -353,6 +353,7 @@ JNI_ENTRY(jclass, jni_DefineClass(JNIEnv *env, const char *name, jobject loaderR
|
||||
@@ -2260,7 +2260,7 @@ index f5db74f4225..7f88297aa10 100644
|
||||
|
||||
if (log_is_enabled(Debug, class, resolve) && k != NULL) {
|
||||
diff --git a/src/hotspot/share/prims/jvm.cpp b/src/hotspot/share/prims/jvm.cpp
|
||||
index 147beffc814..129b71bf0f5 100644
|
||||
index 378dcce8cf5..f92d2697e0e 100644
|
||||
--- a/src/hotspot/share/prims/jvm.cpp
|
||||
+++ b/src/hotspot/share/prims/jvm.cpp
|
||||
@@ -936,6 +936,7 @@ static jclass jvm_define_class_common(JNIEnv *env, const char *name,
|
||||
@@ -4806,10 +4806,10 @@ index f54c9b713be..54617f05b5a 100644
|
||||
VMThread::execute(&op);
|
||||
return (op.check_error());
|
||||
diff --git a/src/hotspot/share/prims/jvmtiExport.cpp b/src/hotspot/share/prims/jvmtiExport.cpp
|
||||
index a63b0f67423..9e70e3bc3f8 100644
|
||||
index 6600848e2d3..9337b6ab585 100644
|
||||
--- a/src/hotspot/share/prims/jvmtiExport.cpp
|
||||
+++ b/src/hotspot/share/prims/jvmtiExport.cpp
|
||||
@@ -2783,7 +2783,7 @@ JvmtiDynamicCodeEventCollector::JvmtiDynamicCodeEventCollector() : _code_blobs(N
|
||||
@@ -2780,7 +2780,7 @@ JvmtiDynamicCodeEventCollector::JvmtiDynamicCodeEventCollector() : _code_blobs(N
|
||||
// iterate over any code blob descriptors collected and post a
|
||||
// DYNAMIC_CODE_GENERATED event to the profiler.
|
||||
JvmtiDynamicCodeEventCollector::~JvmtiDynamicCodeEventCollector() {
|
||||
@@ -4819,7 +4819,7 @@ index a63b0f67423..9e70e3bc3f8 100644
|
||||
if (_code_blobs != NULL) {
|
||||
for (int i=0; i<_code_blobs->length(); i++) {
|
||||
diff --git a/src/hotspot/share/prims/jvmtiExport.hpp b/src/hotspot/share/prims/jvmtiExport.hpp
|
||||
index b8246554f74..be2c373aba7 100644
|
||||
index cc5868f1e93..a6cbac03bb2 100644
|
||||
--- a/src/hotspot/share/prims/jvmtiExport.hpp
|
||||
+++ b/src/hotspot/share/prims/jvmtiExport.hpp
|
||||
@@ -176,6 +176,7 @@ class JvmtiExport : public AllStatic {
|
||||
@@ -4866,10 +4866,10 @@ index a0a6a6cbd18..39953a71244 100644
|
||||
for (InstanceKlass* pv_node = ik->previous_versions();
|
||||
pv_node != NULL;
|
||||
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
index 5c1ed782b8f..5bca664c7c0 100644
|
||||
index c071e0641d4..a9057893368 100644
|
||||
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
@@ -202,6 +202,8 @@ void ResolvedMethodTable::print() {
|
||||
@@ -201,6 +201,8 @@ void ResolvedMethodTable::print() {
|
||||
void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
|
||||
// For each entry in RMT, change to new method
|
||||
@@ -4878,7 +4878,7 @@ index 5c1ed782b8f..5bca664c7c0 100644
|
||||
for (int i = 0; i < _the_table->table_size(); ++i) {
|
||||
for (ResolvedMethodEntry* entry = _the_table->bucket(i);
|
||||
entry != NULL;
|
||||
@@ -216,18 +218,30 @@ void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
|
||||
@@ -215,18 +217,30 @@ void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
|
||||
|
||||
if (old_method->is_old()) {
|
||||
|
||||
@@ -4918,7 +4918,7 @@ index 5c1ed782b8f..5bca664c7c0 100644
|
||||
|
||||
ResourceMark rm;
|
||||
if (!(*trace_name_printed)) {
|
||||
@@ -236,9 +250,14 @@ void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
|
||||
@@ -235,9 +249,14 @@ void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
|
||||
}
|
||||
log_debug(redefine, class, update, constantpool)
|
||||
("ResolvedMethod method update: %s(%s)",
|
||||
@@ -4997,10 +4997,10 @@ index bd439aab073..cc7f71a4404 100644
|
||||
static size_t max_heap_for_compressed_oops();
|
||||
|
||||
diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
|
||||
index 5c389505417..194242e4c4b 100644
|
||||
index 4a53ecb37a8..a6c33744760 100644
|
||||
--- a/src/hotspot/share/runtime/globals.hpp
|
||||
+++ b/src/hotspot/share/runtime/globals.hpp
|
||||
@@ -2680,7 +2680,11 @@ define_pd_global(uint64_t,MaxRAM, 1ULL*G);
|
||||
@@ -2674,7 +2674,11 @@ define_pd_global(uint64_t,MaxRAM, 1ULL*G);
|
||||
"Start flight recording with options")) \
|
||||
\
|
||||
experimental(bool, UseFastUnorderedTimeStamps, false, \
|
||||
@@ -5043,7 +5043,7 @@ index 563ffdbd446..55f06eadcc2 100644
|
||||
_result = result;
|
||||
|
||||
diff --git a/src/hotspot/share/runtime/mutexLocker.cpp b/src/hotspot/share/runtime/mutexLocker.cpp
|
||||
index 42f1fa9626f..16e91c85fd1 100644
|
||||
index d504ef00f90..982ba1b69d5 100644
|
||||
--- a/src/hotspot/share/runtime/mutexLocker.cpp
|
||||
+++ b/src/hotspot/share/runtime/mutexLocker.cpp
|
||||
@@ -5,7 +5,7 @@
|
||||
@@ -5064,7 +5064,7 @@ index 42f1fa9626f..16e91c85fd1 100644
|
||||
Monitor* GCTaskManager_lock = NULL;
|
||||
|
||||
Mutex* Management_lock = NULL;
|
||||
@@ -291,6 +293,7 @@ void mutex_init() {
|
||||
@@ -285,6 +287,7 @@ void mutex_init() {
|
||||
def(JNIGlobalActive_lock , PaddedMutex , nonleaf-1, true, Monitor::_safepoint_check_never);
|
||||
def(JNIWeakAlloc_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_never);
|
||||
def(JNIWeakActive_lock , PaddedMutex , nonleaf-1, true, Monitor::_safepoint_check_never);
|
||||
@@ -5073,10 +5073,10 @@ index 42f1fa9626f..16e91c85fd1 100644
|
||||
def(AdapterHandlerLibrary_lock , PaddedMutex , nonleaf, true, Monitor::_safepoint_check_always);
|
||||
|
||||
diff --git a/src/hotspot/share/runtime/mutexLocker.hpp b/src/hotspot/share/runtime/mutexLocker.hpp
|
||||
index 0d263ca55ba..b41abcb82ae 100644
|
||||
index 12366c7ead1..70aeb1bd0c1 100644
|
||||
--- a/src/hotspot/share/runtime/mutexLocker.hpp
|
||||
+++ b/src/hotspot/share/runtime/mutexLocker.hpp
|
||||
@@ -124,6 +124,8 @@ extern Mutex* PerfDataManager_lock; // a long on access to PerfData
|
||||
@@ -123,6 +123,8 @@ extern Mutex* PerfDataManager_lock; // a long on access to PerfData
|
||||
extern Mutex* ParkerFreeList_lock;
|
||||
extern Mutex* OopMapCacheAlloc_lock; // protects allocation of oop_map caches
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 4cbc3b3e13472d7690098240d6d954597c269c7a Mon Sep 17 00:00:00 2001
|
||||
From ebd5c9df33771ad5181a225cccc0cca3881a4dbe Mon Sep 17 00:00:00 2001
|
||||
From: skybber <lada.dvorak7@gmail.com>
|
||||
Date: Wed, 14 Nov 2018 21:18:22 +0100
|
||||
Subject: [PATCH 02/31] dcevm11 fixes
|
||||
Subject: [PATCH 02/18] dcevm11 fixes
|
||||
|
||||
1. We need to set classRedefinitionCount on new class, not old class.
|
||||
|
||||
@@ -82,7 +82,7 @@ dmh
|
||||
19 files changed, 324 insertions(+), 415 deletions(-)
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/classFileParser.cpp b/src/hotspot/share/classfile/classFileParser.cpp
|
||||
index 0c6c3a86965..b03272da179 100644
|
||||
index e2b8c5793d0..5e1c740a3d2 100644
|
||||
--- a/src/hotspot/share/classfile/classFileParser.cpp
|
||||
+++ b/src/hotspot/share/classfile/classFileParser.cpp
|
||||
@@ -954,6 +954,7 @@ void ClassFileParser::parse_interfaces(const ClassFileStream* const stream,
|
||||
@@ -124,10 +124,10 @@ index d792ab4bb3f..de48092bde8 100644
|
||||
|
||||
public:
|
||||
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
index e2754d5f5be..1c0d5b0a8f2 100644
|
||||
index 25103fff2c0..ab2615da0ed 100644
|
||||
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
@@ -1245,6 +1245,7 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*)) {
|
||||
@@ -1242,6 +1242,7 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*)) {
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,7 +135,7 @@ index e2754d5f5be..1c0d5b0a8f2 100644
|
||||
void ClassLoaderDataGraph::dictionary_classes_do(KlassClosure* klass_closure) {
|
||||
FOR_ALL_DICTIONARY(cld) {
|
||||
cld->dictionary()->classes_do(klass_closure);
|
||||
@@ -1260,6 +1261,7 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*, TRAPS),
|
||||
@@ -1257,6 +1258,7 @@ void ClassLoaderDataGraph::dictionary_classes_do(void f(InstanceKlass*, TRAPS),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,7 +143,7 @@ index e2754d5f5be..1c0d5b0a8f2 100644
|
||||
void ClassLoaderDataGraph::rollback_redefinition() {
|
||||
FOR_ALL_DICTIONARY(cld) {
|
||||
cld->dictionary()->rollback_redefinition();
|
||||
@@ -1390,12 +1392,13 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
@@ -1387,12 +1389,13 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
// Klassesoto delete.
|
||||
|
||||
// FIXME: dcevm - block asserts in MetadataOnStackMark
|
||||
@@ -163,7 +163,7 @@ index e2754d5f5be..1c0d5b0a8f2 100644
|
||||
|
||||
// Save previous _unloading pointer for CMS which may add to unloading list before
|
||||
// purging and we don't want to rewalk the previously unloaded class loader data.
|
||||
@@ -1405,12 +1408,12 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
@@ -1402,12 +1405,12 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
while (data != NULL) {
|
||||
if (data->is_alive()) {
|
||||
// clean metaspace
|
||||
@@ -182,7 +182,7 @@ index e2754d5f5be..1c0d5b0a8f2 100644
|
||||
data = data->next();
|
||||
loaders_processed++;
|
||||
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
|
||||
index 5bd048d8627..a97b48fe5bb 100644
|
||||
index 118730f1b83..dda5188c370 100644
|
||||
--- a/src/hotspot/share/classfile/dictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/dictionary.cpp
|
||||
@@ -245,6 +245,8 @@ void Dictionary::classes_do(void f(InstanceKlass*)) {
|
||||
@@ -244,7 +244,7 @@ index a26b9d1cb55..3d5a59a04ff 100644
|
||||
for (int index = 0; index < table_size(); index++) {
|
||||
LoaderConstraintEntry** p = bucket_addr(index);
|
||||
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
index 1ab9b99b435..52b6ed22b5d 100644
|
||||
index 5a745b6fca6..19bc8d9899a 100644
|
||||
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
@@ -876,7 +876,8 @@ Klass* SystemDictionary::resolve_instance_class_or_null(Symbol* name,
|
||||
@@ -266,7 +266,7 @@ index 1ab9b99b435..52b6ed22b5d 100644
|
||||
if (!DumpSharedSpaces) {
|
||||
k = SystemDictionaryShared::lookup_from_stream(class_name,
|
||||
class_loader,
|
||||
@@ -1837,7 +1838,7 @@ void SystemDictionary::add_to_hierarchy(InstanceKlass* k, TRAPS) {
|
||||
@@ -1835,7 +1836,7 @@ void SystemDictionary::add_to_hierarchy(InstanceKlass* k, TRAPS) {
|
||||
CodeCache::flush_dependents_on(k);
|
||||
}
|
||||
|
||||
@@ -275,7 +275,7 @@ index 1ab9b99b435..52b6ed22b5d 100644
|
||||
void SystemDictionary::remove_from_hierarchy(InstanceKlass* k) {
|
||||
assert(k != NULL, "just checking");
|
||||
|
||||
@@ -1845,6 +1846,7 @@ void SystemDictionary::remove_from_hierarchy(InstanceKlass* k) {
|
||||
@@ -1843,6 +1844,7 @@ void SystemDictionary::remove_from_hierarchy(InstanceKlass* k) {
|
||||
k->remove_from_sibling_list();
|
||||
}
|
||||
|
||||
@@ -1528,10 +1528,10 @@ index 39953a71244..b59d3046b88 100644
|
||||
|
||||
// search previous versions if they exist
|
||||
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
index 5bca664c7c0..4498bdcd77e 100644
|
||||
index a9057893368..af2ec48c2e1 100644
|
||||
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
@@ -198,8 +198,52 @@ void ResolvedMethodTable::print() {
|
||||
@@ -197,8 +197,52 @@ void ResolvedMethodTable::print() {
|
||||
#endif // PRODUCT
|
||||
|
||||
#if INCLUDE_JVMTI
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From fc483e0a98a0bb8042df60567fa238d00bf66263 Mon Sep 17 00:00:00 2001
|
||||
From aaefe6f66a8d363eb35fcdc8ce29bb25be67fe1c Mon Sep 17 00:00:00 2001
|
||||
From: skybber <lada.dvorak7@gmail.com>
|
||||
Date: Wed, 12 Dec 2018 19:38:28 +0100
|
||||
Subject: [PATCH 03/31] Support for Concurrent Mark Sweep (CMS) collector
|
||||
Subject: [PATCH 03/18] Support for Concurrent Mark Sweep (CMS) collector
|
||||
|
||||
---
|
||||
.../share/gc/cms/compactibleFreeListSpace.cpp | 139 ++++++++++++------
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 61bd37c232d7a2f6ee607f39c29e6e231cb4f36d Mon Sep 17 00:00:00 2001
|
||||
From 002ad1880190d0749f8f8d325c587fd9275bdab2 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <vladimir.dvorak@mailprofiler.com>
|
||||
Date: Wed, 11 Mar 2020 14:19:34 +0100
|
||||
Subject: [PATCH 04/31] Fix class cast exception on redefinition of class A,
|
||||
Subject: [PATCH 04/18] Fix class cast exception on redefinition of class A,
|
||||
that is superclass of B that has anonymous class C
|
||||
|
||||
---
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From da3762cb7687c58c89303092a7e8ed92d4c00cef Mon Sep 17 00:00:00 2001
|
||||
From a00292280f4e3754bffc7a0c562dca1d7552eb39 Mon Sep 17 00:00:00 2001
|
||||
From: skybber <lada.dvorak7@gmail.com>
|
||||
Date: Thu, 15 Nov 2018 03:20:08 +0700
|
||||
Subject: [PATCH 05/31] HotswapAgent integration
|
||||
Date: Wed, 14 Nov 2018 21:20:08 +0100
|
||||
Subject: [PATCH 05/18] HotswapAgent integration
|
||||
|
||||
It include:
|
||||
|
||||
@@ -37,7 +37,7 @@ old DCEVM
|
||||
make/launcher/Launcher-jdk.jartool.gmk | 2 +
|
||||
make/launcher/Launcher-jdk.javadoc.gmk | 3 +-
|
||||
make/launcher/Launcher-jdk.jcmd.gmk | 13 +++-
|
||||
make/launcher/Launcher-jdk.jconsole.gmk | 1 +
|
||||
make/launcher/Launcher-jdk.jconsole.gmk | 3 +-
|
||||
make/launcher/Launcher-jdk.jdeps.gmk | 3 +
|
||||
make/launcher/Launcher-jdk.jdi.gmk | 1 +
|
||||
make/launcher/Launcher-jdk.jlink.gmk | 5 +-
|
||||
@@ -55,7 +55,7 @@ old DCEVM
|
||||
.../classes/com/sun/beans/package-info.java | 26 +++++++
|
||||
.../com/sun/beans/util/package-info.java | 26 +++++++
|
||||
.../share/classes/module-info.java | 3 +
|
||||
28 files changed, 208 insertions(+), 10 deletions(-)
|
||||
28 files changed, 209 insertions(+), 11 deletions(-)
|
||||
create mode 100644 src/java.desktop/share/classes/com/sun/beans/introspect/package-info.java
|
||||
create mode 100644 src/java.desktop/share/classes/com/sun/beans/package-info.java
|
||||
create mode 100644 src/java.desktop/share/classes/com/sun/beans/util/package-info.java
|
||||
@@ -259,14 +259,16 @@ index 7117fa78059..761a52d8466 100644
|
||||
|
||||
# Hook to include the corresponding custom file, if present.
|
||||
diff --git a/make/launcher/Launcher-jdk.jconsole.gmk b/make/launcher/Launcher-jdk.jconsole.gmk
|
||||
index 575b9e0595b..2f442f69113 100644
|
||||
index 575b9e0595b..9b38683a489 100644
|
||||
--- a/make/launcher/Launcher-jdk.jconsole.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.jconsole.gmk
|
||||
@@ -30,6 +30,7 @@ $(eval $(call SetupBuildLauncher, jconsole, \
|
||||
@@ -29,7 +29,8 @@ $(eval $(call SetupBuildLauncher, jconsole, \
|
||||
MAIN_CLASS := sun.tools.jconsole.JConsole, \
|
||||
JAVA_ARGS := --add-opens java.base/java.io=jdk.jconsole \
|
||||
-Djconsole.showOutputViewer \
|
||||
-Djdk.attach.allowAttachSelf=true, \
|
||||
+ -XX:+DisableHotswapAgent, \
|
||||
- -Djdk.attach.allowAttachSelf=true, \
|
||||
+ -Djdk.attach.allowAttachSelf=true \
|
||||
+ -XX:+DisableHotswapAgent, \
|
||||
CFLAGS_windows := -DJAVAW, \
|
||||
LIBS_windows := user32.lib, \
|
||||
))
|
||||
@@ -390,10 +392,10 @@ index 82311e69fd6..bd39f8595b2 100644
|
||||
CFLAGS := -DENABLE_ARG_FILES, \
|
||||
))
|
||||
diff --git a/src/hotspot/share/classfile/vmSymbols.hpp b/src/hotspot/share/classfile/vmSymbols.hpp
|
||||
index 17f7e720c95..0d0badeabd0 100644
|
||||
index 41e9a84cd69..1f67eb202b5 100644
|
||||
--- a/src/hotspot/share/classfile/vmSymbols.hpp
|
||||
+++ b/src/hotspot/share/classfile/vmSymbols.hpp
|
||||
@@ -343,6 +343,7 @@
|
||||
@@ -342,6 +342,7 @@
|
||||
/* common method and field names */ \
|
||||
template(object_initializer_name, "<init>") \
|
||||
template(class_initializer_name, "<clinit>") \
|
||||
@@ -511,7 +513,7 @@ index cc7f71a4404..b2bab2e1f44 100644
|
||||
static size_t max_heap_for_compressed_oops();
|
||||
|
||||
diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
|
||||
index 194242e4c4b..9c007fc2d82 100644
|
||||
index a6c33744760..b8dba232fc1 100644
|
||||
--- a/src/hotspot/share/runtime/globals.hpp
|
||||
+++ b/src/hotspot/share/runtime/globals.hpp
|
||||
@@ -32,6 +32,12 @@
|
||||
@@ -527,7 +529,7 @@ index 194242e4c4b..9c007fc2d82 100644
|
||||
// The larger HeapWordSize for 64bit requires larger heaps
|
||||
// for the same application running in 64bit. See bug 4967770.
|
||||
// The minimum alignment to a heap word size is done. Other
|
||||
@@ -2684,8 +2690,10 @@ define_pd_global(uint64_t,MaxRAM, 1ULL*G);
|
||||
@@ -2678,8 +2684,10 @@ define_pd_global(uint64_t,MaxRAM, 1ULL*G);
|
||||
\
|
||||
product(bool, AllowEnhancedClassRedefinition, true, \
|
||||
"Allow enhanced class redefinition beyond swapping method " \
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 124f27f271c87f37f342028412bc7387f2028cde Mon Sep 17 00:00:00 2001
|
||||
From 62f3578e0a73913c1262a1612a464d19abfeb626 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Sun, 4 Oct 2020 21:12:12 +0200
|
||||
Subject: [PATCH 06/31] Support for Lambda class redefinition
|
||||
Subject: [PATCH 06/18] Support for Lambda class redefinition
|
||||
|
||||
---
|
||||
.../share/classfile/classLoaderData.cpp | 9 +++
|
||||
@@ -15,7 +15,7 @@ Subject: [PATCH 06/31] Support for Lambda class redefinition
|
||||
8 files changed, 85 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
index 1c0d5b0a8f2..d5ee3c0338c 100644
|
||||
index ab2615da0ed..1bc67adf5a7 100644
|
||||
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
@@ -663,6 +663,15 @@ Dictionary* ClassLoaderData::create_dictionary() {
|
||||
@@ -47,7 +47,7 @@ index 7e357929971..00a84610b43 100644
|
||||
|
||||
void unload();
|
||||
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
index 52b6ed22b5d..1dd53e0b7bc 100644
|
||||
index 19bc8d9899a..a6a03d3c0e9 100644
|
||||
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
@@ -971,12 +971,16 @@ InstanceKlass* SystemDictionary::parse_stream(Symbol* class_name,
|
||||
@@ -81,7 +81,7 @@ index 52b6ed22b5d..1dd53e0b7bc 100644
|
||||
|
||||
if (host_klass != NULL && k != NULL) {
|
||||
// Anonymous classes must update ClassLoaderData holder (was host_klass loader)
|
||||
@@ -1846,7 +1854,7 @@ void SystemDictionary::remove_from_hierarchy(InstanceKlass* k) {
|
||||
@@ -1844,7 +1852,7 @@ void SystemDictionary::remove_from_hierarchy(InstanceKlass* k) {
|
||||
k->remove_from_sibling_list();
|
||||
}
|
||||
|
||||
@@ -91,10 +91,10 @@ index 52b6ed22b5d..1dd53e0b7bc 100644
|
||||
constraints()->update_after_redefinition();
|
||||
}
|
||||
diff --git a/src/hotspot/share/classfile/systemDictionary.hpp b/src/hotspot/share/classfile/systemDictionary.hpp
|
||||
index b956c6a7519..a8359143908 100644
|
||||
index 06f6c869d63..1dbbffa197f 100644
|
||||
--- a/src/hotspot/share/classfile/systemDictionary.hpp
|
||||
+++ b/src/hotspot/share/classfile/systemDictionary.hpp
|
||||
@@ -307,6 +307,7 @@ public:
|
||||
@@ -304,6 +304,7 @@ public:
|
||||
protection_domain,
|
||||
st,
|
||||
NULL, // host klass
|
||||
@@ -102,7 +102,7 @@ index b956c6a7519..a8359143908 100644
|
||||
NULL, // cp_patches
|
||||
THREAD);
|
||||
}
|
||||
@@ -315,6 +316,7 @@ public:
|
||||
@@ -312,6 +313,7 @@ public:
|
||||
Handle protection_domain,
|
||||
ClassFileStream* st,
|
||||
const InstanceKlass* host_klass,
|
||||
@@ -220,10 +220,10 @@ index a48e07e3a6a..3551b06ecde 100644
|
||||
// Figure out which new methods match old methods in name and signature,
|
||||
// which methods have been added, and which are no longer present
|
||||
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
index 4498bdcd77e..8966ee8a00a 100644
|
||||
index af2ec48c2e1..7741328979f 100644
|
||||
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
@@ -201,7 +201,7 @@ void ResolvedMethodTable::print() {
|
||||
@@ -200,7 +200,7 @@ void ResolvedMethodTable::print() {
|
||||
|
||||
void ResolvedMethodTable::adjust_method_entries(bool * trace_name_printed) {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "only called at safepoint");
|
||||
@@ -232,7 +232,7 @@ index 4498bdcd77e..8966ee8a00a 100644
|
||||
for (int i = 0; i < _the_table->table_size(); ++i) {
|
||||
for (ResolvedMethodEntry* entry = _the_table->bucket(i);
|
||||
entry != NULL;
|
||||
@@ -272,6 +272,8 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||
@@ -271,6 +271,8 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||
InstanceKlass* newer_klass = InstanceKlass::cast(old_method->method_holder()->new_version());
|
||||
Method* newer_method = newer_klass->method_with_idnum(old_method->orig_method_idnum());
|
||||
|
||||
@@ -242,7 +242,7 @@ index 4498bdcd77e..8966ee8a00a 100644
|
||||
assert(newer_method != NULL, "method_with_idnum() should not be NULL");
|
||||
assert(old_method != newer_method, "sanity check");
|
||||
diff --git a/src/hotspot/share/prims/unsafe.cpp b/src/hotspot/share/prims/unsafe.cpp
|
||||
index 1983b4f45f0..5e7aca092eb 100644
|
||||
index c071f8b7cc6..e484b8991d1 100644
|
||||
--- a/src/hotspot/share/prims/unsafe.cpp
|
||||
+++ b/src/hotspot/share/prims/unsafe.cpp
|
||||
@@ -820,6 +820,7 @@ Unsafe_DefineAnonymousClass_impl(JNIEnv *env,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 6ea212ab2f71a8c874be649b2342053134dff9ea Mon Sep 17 00:00:00 2001
|
||||
From 4b445e7a7f77f82f757c12010e3c88b2eb4698f9 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Sat, 23 May 2020 10:02:15 +0200
|
||||
Subject: [PATCH 07/31] Fix "no original bytecode found" error if method with
|
||||
Subject: [PATCH 07/18] Fix "no original bytecode found" error if method with
|
||||
bkp is missing
|
||||
|
||||
Sometimes IDE can deploy class with erroneous method, such method has
|
||||
@@ -41,10 +41,10 @@ index c25e13d83e8..2a66419908c 100644
|
||||
|
||||
IRT_ENTRY(void, InterpreterRuntime::set_original_bytecode_at(JavaThread* thread, Method* method, address bcp, Bytecodes::Code new_code))
|
||||
diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp
|
||||
index e47dd223f92..165a2e4de36 100644
|
||||
index ed6f769bf1b..031f255e632 100644
|
||||
--- a/src/hotspot/share/oops/method.cpp
|
||||
+++ b/src/hotspot/share/oops/method.cpp
|
||||
@@ -1789,14 +1789,14 @@ bool CompressedLineNumberReadStream::read_pair() {
|
||||
@@ -1744,14 +1744,14 @@ bool CompressedLineNumberReadStream::read_pair() {
|
||||
|
||||
#if INCLUDE_JVMTI
|
||||
|
||||
@@ -61,7 +61,7 @@ index e47dd223f92..165a2e4de36 100644
|
||||
ResourceMark rm;
|
||||
fatal("no original bytecode found in %s at bci %d", name_and_sig_as_C_string(), bci);
|
||||
}
|
||||
@@ -1942,7 +1942,7 @@ BreakpointInfo::BreakpointInfo(Method* m, int bci) {
|
||||
@@ -1897,7 +1897,7 @@ BreakpointInfo::BreakpointInfo(Method* m, int bci) {
|
||||
_signature_index = m->signature_index();
|
||||
_orig_bytecode = (Bytecodes::Code) *m->bcp_from(_bci);
|
||||
if (_orig_bytecode == Bytecodes::_breakpoint)
|
||||
@@ -70,7 +70,7 @@ index e47dd223f92..165a2e4de36 100644
|
||||
_next = NULL;
|
||||
}
|
||||
|
||||
@@ -1951,7 +1951,7 @@ void BreakpointInfo::set(Method* method) {
|
||||
@@ -1906,7 +1906,7 @@ void BreakpointInfo::set(Method* method) {
|
||||
{
|
||||
Bytecodes::Code code = (Bytecodes::Code) *method->bcp_from(_bci);
|
||||
if (code == Bytecodes::_breakpoint)
|
||||
@@ -80,7 +80,7 @@ index e47dd223f92..165a2e4de36 100644
|
||||
}
|
||||
#endif
|
||||
diff --git a/src/hotspot/share/oops/method.hpp b/src/hotspot/share/oops/method.hpp
|
||||
index 4ac3e6e80de..9ff4f0e8036 100644
|
||||
index 4533476ff8f..193e1845b23 100644
|
||||
--- a/src/hotspot/share/oops/method.hpp
|
||||
+++ b/src/hotspot/share/oops/method.hpp
|
||||
@@ -230,7 +230,7 @@ class Method : public Metadata {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From dc73c2dc3268a8b17844b75b76e14b5d0e3c1259 Mon Sep 17 00:00:00 2001
|
||||
From c022124c6e0680d2dfc174f66fc858b0eb2591dc Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Sun, 24 May 2020 12:07:42 +0200
|
||||
Subject: [PATCH 08/31] Replace deleted method with
|
||||
Subject: [PATCH 08/18] Replace deleted method with
|
||||
Universe::throw_no_such_method_error
|
||||
|
||||
---
|
||||
@@ -9,10 +9,10 @@ Subject: [PATCH 08/31] Replace deleted method with
|
||||
1 file changed, 14 insertions(+), 14 deletions(-)
|
||||
|
||||
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
index 8966ee8a00a..c3ed1d28fe5 100644
|
||||
index 7741328979f..06581643c3b 100644
|
||||
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
@@ -262,25 +262,25 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||
@@ -261,25 +261,25 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||
|
||||
if (old_method->is_old()) {
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 2a004a093c23ca8515954d180064a59cdcaba0f8 Mon Sep 17 00:00:00 2001
|
||||
From aa1d291c7349e5cecf9d93e817d0866460deb903 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Fri, 12 Jun 2020 17:43:52 +0200
|
||||
Subject: [PATCH 09/31] Support for G1 gc
|
||||
Subject: [PATCH 09/18] Support for G1 gc
|
||||
|
||||
---
|
||||
src/hotspot/share/gc/g1/g1CollectedHeap.cpp | 20 +++
|
||||
@@ -31,10 +31,10 @@ Subject: [PATCH 09/31] Support for G1 gc
|
||||
create mode 100644 src/hotspot/share/gc/shared/dcevmSharedGC.hpp
|
||||
|
||||
diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
|
||||
index 83b7d6b5077..c4ae1eee351 100644
|
||||
index dea8d9fdb0e..33664a30519 100644
|
||||
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
|
||||
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.cpp
|
||||
@@ -2115,6 +2115,21 @@ public:
|
||||
@@ -2108,6 +2108,21 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
@@ -56,7 +56,7 @@ index 83b7d6b5077..c4ae1eee351 100644
|
||||
void G1CollectedHeap::object_iterate(ObjectClosure* cl) {
|
||||
IterateObjectClosureRegionClosure blk(cl);
|
||||
heap_region_iterate(&blk);
|
||||
@@ -2128,6 +2143,11 @@ void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const {
|
||||
@@ -2117,6 +2132,11 @@ void G1CollectedHeap::heap_region_iterate(HeapRegionClosure* cl) const {
|
||||
_hrm.iterate(cl);
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ index 83b7d6b5077..c4ae1eee351 100644
|
||||
HeapRegionClaimer *hrclaimer,
|
||||
uint worker_id) const {
|
||||
diff --git a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
|
||||
index be160d04bfe..9e92ee4a1fa 100644
|
||||
index 8a171dc6b52..05a068bb2e0 100644
|
||||
--- a/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
|
||||
+++ b/src/hotspot/share/gc/g1/g1CollectedHeap.hpp
|
||||
@@ -144,6 +144,7 @@ class G1CollectedHeap : public CollectedHeap {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From b49d26f6e512f5bbdb89c360e8cb73e3bbd037e4 Mon Sep 17 00:00:00 2001
|
||||
From b6ea0ee6fcc376f575be0f461c494664d55ed986 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Sat, 13 Jun 2020 18:50:59 +0200
|
||||
Subject: [PATCH 10/31] Change log level in advanced redefinition
|
||||
Subject: [PATCH 10/18] Change log level in advanced redefinition
|
||||
|
||||
- Change log level for "Comparing different class ver.." to debug
|
||||
- Fix adjust_method_entries_dcevm logging levels and severity
|
||||
@@ -24,10 +24,10 @@ index 8b6fad2128e..a8adfa5af47 100644
|
||||
assert(new_class->old_version() != NULL, "must have old version");
|
||||
InstanceKlass* the_class = InstanceKlass::cast(new_class->old_version());
|
||||
diff --git a/src/hotspot/share/prims/resolvedMethodTable.cpp b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
index c3ed1d28fe5..650007b26ff 100644
|
||||
index 06581643c3b..10806bee29b 100644
|
||||
--- a/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
+++ b/src/hotspot/share/prims/resolvedMethodTable.cpp
|
||||
@@ -271,7 +271,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||
@@ -270,7 +270,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||
} else {
|
||||
newer_method = newer_klass->method_with_idnum(old_method->orig_method_idnum());
|
||||
|
||||
@@ -36,7 +36,7 @@ index c3ed1d28fe5..650007b26ff 100644
|
||||
|
||||
assert(newer_klass == newer_method->method_holder(), "call after swapping redefined guts");
|
||||
assert(newer_method != NULL, "method_with_idnum() should not be NULL");
|
||||
@@ -291,7 +291,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||
@@ -290,7 +290,7 @@ void ResolvedMethodTable::adjust_method_entries_dcevm(bool * trace_name_printed)
|
||||
|
||||
ResourceMark rm;
|
||||
if (!(*trace_name_printed)) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 993fa0c4dc645102204d8dcf716407bcc84e5e7f Mon Sep 17 00:00:00 2001
|
||||
From ef1098751c596a03fd1721affc20d221b3544d37 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Tue, 6 Oct 2020 22:15:31 +0200
|
||||
Subject: [PATCH 11/31] AllowEnhancedClassRedefinition is false (disabled) by
|
||||
Subject: [PATCH 11/18] AllowEnhancedClassRedefinition is false (disabled) by
|
||||
default
|
||||
|
||||
---
|
||||
@@ -9,10 +9,10 @@ Subject: [PATCH 11/31] AllowEnhancedClassRedefinition is false (disabled) by
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
|
||||
index 9c007fc2d82..705381825ff 100644
|
||||
index b8dba232fc1..d4453de1ff5 100644
|
||||
--- a/src/hotspot/share/runtime/globals.hpp
|
||||
+++ b/src/hotspot/share/runtime/globals.hpp
|
||||
@@ -2688,7 +2688,7 @@ define_pd_global(uint64_t,MaxRAM, 1ULL*G);
|
||||
@@ -2682,7 +2682,7 @@ define_pd_global(uint64_t,MaxRAM, 1ULL*G);
|
||||
experimental(bool, UseFastUnorderedTimeStamps, false, \
|
||||
"Use platform unstable time where supported for timestamps only") \
|
||||
\
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 9604363bb215769dc397cedf1e7b7b89f1d518d8 Mon Sep 17 00:00:00 2001
|
||||
From 6a78dda15c66cbba1ca6a2d7f3df3a55fc087f50 Mon Sep 17 00:00:00 2001
|
||||
From: Artem Khvastunov <artem.khvastunov@jetbrains.com>
|
||||
Date: Tue, 14 Apr 2020 19:11:35 +0200
|
||||
Subject: [PATCH 12/31] add jvmtiEnhancedRedefineClasses.* to CMakeLists.txt
|
||||
Subject: [PATCH 12/18] add jvmtiEnhancedRedefineClasses.* to CMakeLists.txt
|
||||
|
||||
---
|
||||
jb/project/hotspot-cmake/CMakeLists.txt | 2 ++
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
From 00e668de1ec62caa31d8a0d8d64a8e143819b296 Mon Sep 17 00:00:00 2001
|
||||
From 80c1cd01b45735928e3b3e9283b5484ea6a70a7f Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Mon, 19 Oct 2020 20:00:04 +0200
|
||||
Subject: [PATCH 13/31] Set HOTSPOT_VM_DISTRO=Dynamic Code Evolution
|
||||
Subject: [PATCH 13/18] Set HOTSPOT_VM_DISTRO=Dynamic Code Evolution
|
||||
|
||||
---
|
||||
make/autoconf/version-numbers | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/make/autoconf/version-numbers b/make/autoconf/version-numbers
|
||||
index 12a95c59483..662ad155896 100644
|
||||
index 1d08f6a80dc..88b4d460ee8 100644
|
||||
--- a/make/autoconf/version-numbers
|
||||
+++ b/make/autoconf/version-numbers
|
||||
@@ -44,7 +44,7 @@ PRODUCT_NAME=OpenJDK
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From c5e0cc85307942efce6b7946be166ea7ef7ada79 Mon Sep 17 00:00:00 2001
|
||||
From 122562d31005edd3573a645c3a02c1d8fe843c5e Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Sun, 11 Oct 2020 10:43:28 +0200
|
||||
Subject: [PATCH 14/31] Fix G1 nmethod registration
|
||||
Subject: [PATCH 14/18] Fix G1 nmethod registration
|
||||
|
||||
---
|
||||
.../prims/jvmtiEnhancedRedefineClasses.cpp | 19 ++++++++++++++++---
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
From 24f735428a47eeaa0ac5e84f41a437d4964c35ba Mon Sep 17 00:00:00 2001
|
||||
From 0156b2084be20579b407e112a00ba15f54248003 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Thu, 22 Oct 2020 20:15:20 +0200
|
||||
Subject: [PATCH 15/31] Initialize method's _new_version/_old_version to NULL
|
||||
Subject: [PATCH 15/18] Initialize method's _new_version/_old_version to NULL
|
||||
|
||||
---
|
||||
src/hotspot/share/oops/method.cpp | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp
|
||||
index 165a2e4de36..17c08a9dc18 100644
|
||||
index 031f255e632..a9556ecf0c4 100644
|
||||
--- a/src/hotspot/share/oops/method.cpp
|
||||
+++ b/src/hotspot/share/oops/method.cpp
|
||||
@@ -83,7 +83,8 @@ Method* Method::allocate(ClassLoaderData* loader_data,
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 4ca5a545df83c41c0ee4465d5d598aa83f1b106c Mon Sep 17 00:00:00 2001
|
||||
From 81ba8f1d120e158a7b0cfa09b5dd51295d51901f Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Fri, 23 Oct 2020 10:20:26 +0200
|
||||
Subject: [PATCH 16/31] Clear dcevm code separation
|
||||
Subject: [PATCH 16/18] Clear dcevm code separation
|
||||
|
||||
---
|
||||
src/hotspot/share/classfile/systemDictionary.cpp | 4 ++--
|
||||
@@ -15,7 +15,7 @@ Subject: [PATCH 16/31] Clear dcevm code separation
|
||||
8 files changed, 27 insertions(+), 17 deletions(-)
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
index 1dd53e0b7bc..fe537421e22 100644
|
||||
index a6a03d3c0e9..9e0f4dd3c96 100644
|
||||
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
@@ -1152,7 +1152,7 @@ InstanceKlass* SystemDictionary::resolve_from_stream(Symbol* class_name,
|
||||
@@ -27,7 +27,7 @@ index 1dd53e0b7bc..fe537421e22 100644
|
||||
} );
|
||||
|
||||
return k;
|
||||
@@ -2155,7 +2155,7 @@ void SystemDictionary::check_constraints(unsigned int d_hash,
|
||||
@@ -2153,7 +2153,7 @@ void SystemDictionary::check_constraints(unsigned int d_hash,
|
||||
// also hold array classes.
|
||||
|
||||
assert(check->is_instance_klass(), "noninstance in systemdictionary");
|
||||
@@ -93,10 +93,10 @@ index 9dc184d02f5..bff1c3627b0 100644
|
||||
is_static ? "static" : "non-static", resolved_klass->external_name(), fd.name()->as_C_string(),
|
||||
current_klass->external_name());
|
||||
diff --git a/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp b/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp
|
||||
index 61a406377ee..da9df7a21a2 100644
|
||||
index 84891b48c2a..6f19e2939a2 100644
|
||||
--- a/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp
|
||||
+++ b/src/hotspot/share/jfr/instrumentation/jfrEventClassTransformer.cpp
|
||||
@@ -1471,7 +1471,7 @@ static InstanceKlass* create_new_instance_klass(InstanceKlass* ik, ClassFileStre
|
||||
@@ -1467,7 +1467,7 @@ static InstanceKlass* create_new_instance_klass(InstanceKlass* ik, ClassFileStre
|
||||
NULL, // host klass
|
||||
NULL, // cp_patches
|
||||
ClassFileParser::INTERNAL, // internal visibility
|
||||
@@ -148,10 +148,10 @@ index 7eb1b01c785..710e0ddc930 100644
|
||||
|
||||
// Verify implementor fields requires the Compile_lock, but this is sometimes
|
||||
diff --git a/src/hotspot/share/oops/method.cpp b/src/hotspot/share/oops/method.cpp
|
||||
index 17c08a9dc18..2596ed7add2 100644
|
||||
index a9556ecf0c4..6c7edaca67e 100644
|
||||
--- a/src/hotspot/share/oops/method.cpp
|
||||
+++ b/src/hotspot/share/oops/method.cpp
|
||||
@@ -2145,7 +2145,7 @@ void Method::ensure_jmethod_ids(ClassLoaderData* loader_data, int capacity) {
|
||||
@@ -2100,7 +2100,7 @@ void Method::ensure_jmethod_ids(ClassLoaderData* loader_data, int capacity) {
|
||||
// Add a method id to the jmethod_ids
|
||||
jmethodID Method::make_jmethod_id(ClassLoaderData* loader_data, Method* m) {
|
||||
// FIXME: (DCEVM) ???
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From e029e021d4fbc24506571ad83555189175b9ebad Mon Sep 17 00:00:00 2001
|
||||
From a022248d12e37084c8f8987a44d567ba0e02fb6d Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Fri, 23 Oct 2020 11:07:40 +0200
|
||||
Subject: [PATCH 17/31] Fix metadataOnStack bug
|
||||
Subject: [PATCH 17/18] Fix metadataOnStack bug
|
||||
|
||||
---
|
||||
.../share/classfile/classLoaderData.cpp | 7 +-
|
||||
@@ -11,10 +11,10 @@ Subject: [PATCH 17/31] Fix metadataOnStack bug
|
||||
4 files changed, 41 insertions(+), 38 deletions(-)
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
index d5ee3c0338c..0376777649b 100644
|
||||
index 1bc67adf5a7..bba5ce0511f 100644
|
||||
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
@@ -1401,13 +1401,10 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
@@ -1398,13 +1398,10 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
// Klassesoto delete.
|
||||
|
||||
// FIXME: dcevm - block asserts in MetadataOnStackMark
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From 992ae7e64b6af91e1aab29577203ff2e9fce0dd4 Mon Sep 17 00:00:00 2001
|
||||
From 46795cd6c086e2008b270f89971bb07ad34ac355 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Wed, 11 Nov 2020 18:45:15 +0100
|
||||
Subject: [PATCH 19/31] Fix LoadedClassesClosure - fixes problems with remote
|
||||
Subject: [PATCH 18/18] Fix LoadedClassesClosure - fixes problems with remote
|
||||
debugging
|
||||
|
||||
---
|
||||
@@ -1,25 +0,0 @@
|
||||
From fac0c15ae914e5b45fece5dc8d35d389098bdff7 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Sun, 1 Nov 2020 21:19:00 +0100
|
||||
Subject: [PATCH 18/31] Ignore MetadataOnStackMark if redefining_gc_run
|
||||
|
||||
---
|
||||
src/hotspot/share/classfile/classLoaderData.cpp | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
index 0376777649b..b649d6358ed 100644
|
||||
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
@@ -1404,7 +1404,7 @@ bool ClassLoaderDataGraph::do_unloading(bool clean_previous_versions) {
|
||||
bool walk_all_metadata = clean_previous_versions &&
|
||||
JvmtiExport::has_redefined_a_class() &&
|
||||
InstanceKlass::has_previous_versions_and_reset();
|
||||
- MetadataOnStackMark md_on_stack(walk_all_metadata, AllowEnhancedClassRedefinition);
|
||||
+ MetadataOnStackMark md_on_stack(walk_all_metadata, Universe::is_redefining_gc_run());
|
||||
|
||||
// Save previous _unloading pointer for CMS which may add to unloading list before
|
||||
// purging and we don't want to rewalk the previously unloaded class loader data.
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
From e20336116249d0b7ddb6bfcc69c54627da31d122 Mon Sep 17 00:00:00 2001
|
||||
From 62fc66fa74886bd8bb15cd3e2084175f7ad5d0c7 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||
Date: Fri, 5 Feb 2021 23:30:49 +0100
|
||||
Subject: [PATCH 20/31] Disable AllowEnhancedClassRedefinition in flight
|
||||
Subject: [PATCH 19/19] Disable AllowEnhancedClassRedefinition in flight
|
||||
recorder
|
||||
|
||||
---
|
||||
@@ -1,41 +0,0 @@
|
||||
From 970ff0fd814d94573b929cbc222ff731d3e6e1c8 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||
Date: Fri, 12 Feb 2021 12:33:11 +0100
|
||||
Subject: [PATCH 21/31] JBR-3106 Check InstanceKlass::has_nestmate_access_to
|
||||
with active classes
|
||||
|
||||
Dcevm can leave old host in nested class if nested class is not
|
||||
redefined together with host class
|
||||
---
|
||||
src/hotspot/share/oops/instanceKlass.cpp | 10 ++++++++++
|
||||
1 file changed, 10 insertions(+)
|
||||
|
||||
diff --git a/src/hotspot/share/oops/instanceKlass.cpp b/src/hotspot/share/oops/instanceKlass.cpp
|
||||
index 710e0ddc930..24eb3ed68a6 100644
|
||||
--- a/src/hotspot/share/oops/instanceKlass.cpp
|
||||
+++ b/src/hotspot/share/oops/instanceKlass.cpp
|
||||
@@ -327,11 +327,21 @@ bool InstanceKlass::has_nestmate_access_to(InstanceKlass* k, TRAPS) {
|
||||
return false;
|
||||
}
|
||||
|
||||
+ // (DCEVM) cur_host can be old, decide accessibility based on active version
|
||||
+ if (AllowEnhancedClassRedefinition) {
|
||||
+ cur_host = InstanceKlass::cast(cur_host->active_version());
|
||||
+ }
|
||||
+
|
||||
Klass* k_nest_host = k->nest_host(icce, CHECK_false);
|
||||
if (k_nest_host == NULL) {
|
||||
return false;
|
||||
}
|
||||
|
||||
+ // (DCEVM) k_nest_host can be old, decide accessibility based on active version
|
||||
+ if (AllowEnhancedClassRedefinition) {
|
||||
+ k_nest_host = InstanceKlass::cast(k_nest_host->active_version());
|
||||
+ }
|
||||
+
|
||||
bool access = (cur_host == k_nest_host);
|
||||
|
||||
if (log_is_enabled(Trace, class, nestmates)) {
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
From fc955c851f24501927e14d8200ddc7f2c05faa3c Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Sun, 7 Feb 2021 12:08:58 +0100
|
||||
Subject: [PATCH 22/31] JBR-3110 Fix assert in MetadataOnStackMark
|
||||
|
||||
Fixed fastdebug tests crashes in redefine gc run
|
||||
---
|
||||
src/hotspot/share/classfile/metadataOnStackMark.cpp | 5 +++--
|
||||
1 file changed, 3 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/metadataOnStackMark.cpp b/src/hotspot/share/classfile/metadataOnStackMark.cpp
|
||||
index 9d7bdbde74b..66049f11629 100644
|
||||
--- a/src/hotspot/share/classfile/metadataOnStackMark.cpp
|
||||
+++ b/src/hotspot/share/classfile/metadataOnStackMark.cpp
|
||||
@@ -49,10 +49,11 @@ NOT_PRODUCT(bool MetadataOnStackMark::_is_active = false;)
|
||||
MetadataOnStackMark::MetadataOnStackMark(bool redefinition_walk, bool ignore) : _ignore(ignore) {
|
||||
assert(SafepointSynchronize::is_at_safepoint(), "sanity check");
|
||||
assert(_used_buffers == NULL, "sanity check");
|
||||
- assert(!_is_active, "MetadataOnStackMarks do not nest");
|
||||
- NOT_PRODUCT(_is_active = true;)
|
||||
|
||||
if (!ignore) {
|
||||
+ assert(!_is_active, "MetadataOnStackMarks do not nest");
|
||||
+ NOT_PRODUCT(_is_active = true;)
|
||||
+
|
||||
Threads::metadata_handles_do(Metadata::mark_on_stack);
|
||||
|
||||
if (redefinition_walk) {
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,78 +0,0 @@
|
||||
From 66d88a8d5abfc1dbadf860930bb662cd9c9c690b Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Fri, 12 Feb 2021 11:27:39 +0100
|
||||
Subject: [PATCH 23/31] Code cleanup
|
||||
|
||||
- Rename confusing method name old_if_redefined to old_if_redefining
|
||||
- Remove unused is_redefining_gc_run
|
||||
---
|
||||
src/hotspot/share/classfile/dictionary.cpp | 6 +++---
|
||||
src/hotspot/share/classfile/dictionary.hpp | 2 +-
|
||||
src/hotspot/share/memory/universe.hpp | 5 -----
|
||||
3 files changed, 4 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
|
||||
index a97b48fe5bb..781a929e7de 100644
|
||||
--- a/src/hotspot/share/classfile/dictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/dictionary.cpp
|
||||
@@ -381,7 +381,7 @@ InstanceKlass* Dictionary::find(unsigned int hash, Symbol* name,
|
||||
int index = hash_to_index(hash);
|
||||
DictionaryEntry* entry = get_entry(index, hash, name);
|
||||
if (entry != NULL && entry->is_valid_protection_domain(protection_domain)) {
|
||||
- return old_if_redefined(entry->instance_klass());
|
||||
+ return old_if_redefining(entry->instance_klass());
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
@@ -394,7 +394,7 @@ InstanceKlass* Dictionary::find_class(int index, unsigned int hash,
|
||||
assert (index == index_for(name), "incorrect index?");
|
||||
|
||||
DictionaryEntry* entry = get_entry(index, hash, name);
|
||||
- return old_if_redefined((entry != NULL) ? entry->instance_klass() : NULL);
|
||||
+ return old_if_redefining((entry != NULL) ? entry->instance_klass() : NULL);
|
||||
}
|
||||
|
||||
|
||||
@@ -406,7 +406,7 @@ InstanceKlass* Dictionary::find_shared_class(int index, unsigned int hash,
|
||||
assert (index == index_for(name), "incorrect index?");
|
||||
|
||||
DictionaryEntry* entry = get_entry(index, hash, name);
|
||||
- return old_if_redefined((entry != NULL) ? entry->instance_klass() : NULL);
|
||||
+ return old_if_redefining((entry != NULL) ? entry->instance_klass() : NULL);
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/dictionary.hpp b/src/hotspot/share/classfile/dictionary.hpp
|
||||
index 5eaa741d500..f6e08e7bfd5 100644
|
||||
--- a/src/hotspot/share/classfile/dictionary.hpp
|
||||
+++ b/src/hotspot/share/classfile/dictionary.hpp
|
||||
@@ -120,7 +120,7 @@ public:
|
||||
void rollback_redefinition();
|
||||
|
||||
// (DCEVM) return old class if redefining in AllowEnhancedClassRedefinition, otherwise return "k"
|
||||
- static InstanceKlass* old_if_redefined(InstanceKlass* k) {
|
||||
+ static InstanceKlass* old_if_redefining(InstanceKlass* k) {
|
||||
return (k != NULL && k->is_redefining()) ? ((InstanceKlass* )k->old_version()) : k;
|
||||
}
|
||||
};
|
||||
diff --git a/src/hotspot/share/memory/universe.hpp b/src/hotspot/share/memory/universe.hpp
|
||||
index b32db16b9cf..742dada0e8f 100644
|
||||
--- a/src/hotspot/share/memory/universe.hpp
|
||||
+++ b/src/hotspot/share/memory/universe.hpp
|
||||
@@ -52,13 +52,8 @@ class LatestMethodCache : public CHeapObj<mtClass> {
|
||||
Klass* _klass;
|
||||
int _method_idnum;
|
||||
|
||||
- static bool _is_redefining_gc_run;
|
||||
-
|
||||
public:
|
||||
|
||||
- static bool is_redefining_gc_run() { return _is_redefining_gc_run; }
|
||||
- static void set_redefining_gc_run(bool b) { _is_redefining_gc_run = b; }
|
||||
-
|
||||
LatestMethodCache() { _klass = NULL; _method_idnum = -1; }
|
||||
~LatestMethodCache() { _klass = NULL; _method_idnum = -1; }
|
||||
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,95 +0,0 @@
|
||||
From 94482d0b6d49ee57870c8dcefc207cb1ec707065 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Sat, 13 Feb 2021 20:47:52 +0100
|
||||
Subject: [PATCH 24/31] JBR-3111 Update class in all dictionaries where it was
|
||||
already defined
|
||||
|
||||
This patch keeps compatibility with std redefinition, that does not
|
||||
create a new Klass, but modifies it, then it is modified in all
|
||||
dictionaries containing this class.
|
||||
---
|
||||
src/hotspot/share/classfile/classLoaderData.cpp | 9 +++++++++
|
||||
src/hotspot/share/classfile/classLoaderData.hpp | 3 +++
|
||||
src/hotspot/share/classfile/dictionary.cpp | 2 +-
|
||||
src/hotspot/share/classfile/dictionary.hpp | 2 +-
|
||||
src/hotspot/share/classfile/systemDictionary.cpp | 4 +++-
|
||||
5 files changed, 17 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
index b649d6358ed..a70d92c27fc 100644
|
||||
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
@@ -1277,6 +1277,15 @@ void ClassLoaderDataGraph::rollback_redefinition() {
|
||||
}
|
||||
}
|
||||
|
||||
+// (DCEVM) - iterate over all classes in all dictionaries
|
||||
+bool ClassLoaderDataGraph::dictionary_classes_do_update_klass(Symbol* name, InstanceKlass* k, InstanceKlass* old_klass) {
|
||||
+ bool ok = false;
|
||||
+ FOR_ALL_DICTIONARY(cld) {
|
||||
+ ok = cld->dictionary()->update_klass(name, k, old_klass) || ok;
|
||||
+ }
|
||||
+ return ok;
|
||||
+}
|
||||
+
|
||||
// Walks all entries in the dictionary including entries initiated by this class loader.
|
||||
void ClassLoaderDataGraph::dictionary_all_entries_do(void f(InstanceKlass*, ClassLoaderData*)) {
|
||||
Thread* thread = Thread::current();
|
||||
diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
|
||||
index 00a84610b43..16711dca237 100644
|
||||
--- a/src/hotspot/share/classfile/classLoaderData.hpp
|
||||
+++ b/src/hotspot/share/classfile/classLoaderData.hpp
|
||||
@@ -130,6 +130,9 @@ class ClassLoaderDataGraph : public AllStatic {
|
||||
// Enhanced class redefinition
|
||||
static void rollback_redefinition();
|
||||
|
||||
+ // Enhanced class redefinition
|
||||
+ static bool dictionary_classes_do_update_klass(Symbol* name, InstanceKlass* k, InstanceKlass* old_klass);
|
||||
+
|
||||
// Iterate all classes and their class loaders, including initiating class loaders.
|
||||
static void dictionary_all_entries_do(void f(InstanceKlass*, ClassLoaderData*));
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/dictionary.cpp b/src/hotspot/share/classfile/dictionary.cpp
|
||||
index 781a929e7de..a1baaef86f5 100644
|
||||
--- a/src/hotspot/share/classfile/dictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/dictionary.cpp
|
||||
@@ -345,7 +345,7 @@ DictionaryEntry* Dictionary::get_entry(int index, unsigned int hash,
|
||||
}
|
||||
|
||||
// (DCEVM) replace old_class by new class in dictionary
|
||||
-bool Dictionary::update_klass(unsigned int hash, Symbol* name, ClassLoaderData* loader_data, InstanceKlass* k, InstanceKlass* old_klass) {
|
||||
+bool Dictionary::update_klass(Symbol* name, InstanceKlass* k, InstanceKlass* old_klass) {
|
||||
// There are several entries for the same class in the dictionary: One extra entry for each parent classloader of the classloader of the class.
|
||||
bool found = false;
|
||||
for (int index = 0; index < table_size(); index++) {
|
||||
diff --git a/src/hotspot/share/classfile/dictionary.hpp b/src/hotspot/share/classfile/dictionary.hpp
|
||||
index f6e08e7bfd5..2932cc9c320 100644
|
||||
--- a/src/hotspot/share/classfile/dictionary.hpp
|
||||
+++ b/src/hotspot/share/classfile/dictionary.hpp
|
||||
@@ -115,7 +115,7 @@ public:
|
||||
void free_entry(DictionaryEntry* entry);
|
||||
|
||||
// Enhanced class redefinition
|
||||
- bool update_klass(unsigned int hash, Symbol* name, ClassLoaderData* loader_data, InstanceKlass* k, InstanceKlass* old_klass);
|
||||
+ bool update_klass(Symbol* name, InstanceKlass* k, InstanceKlass* old_klass);
|
||||
|
||||
void rollback_redefinition();
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
index fe537421e22..f7452adcf02 100644
|
||||
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
@@ -1608,7 +1608,9 @@ void SystemDictionary::define_instance_class(InstanceKlass* k, InstanceKlass* ol
|
||||
Dictionary* dictionary = loader_data->dictionary();
|
||||
unsigned int d_hash = dictionary->compute_hash(name_h);
|
||||
if (is_redefining) {
|
||||
- bool ok = dictionary->update_klass(d_hash, name_h, loader_data, k, old_klass);
|
||||
+ // Update all dictionaries containing old_class to new_class
|
||||
+ // outcome must be same as result of standard redefinition, that does not create a new Klass
|
||||
+ bool ok = ClassLoaderDataGraph::dictionary_classes_do_update_klass(name_h, k, old_klass);
|
||||
assert (ok, "must have found old class and updated!");
|
||||
}
|
||||
check_constraints(d_hash, k, class_loader_h, !is_redefining, CHECK);
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,527 +0,0 @@
|
||||
From 7a7a6733faf1ef9fd4787fd67d99e846f480e922 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Thu, 18 Jun 2020 18:40:11 +0200
|
||||
Subject: [PATCH 25/31] JBR-3140 - support for modularized HotswapAgent
|
||||
|
||||
Add -XX:HotswapAgent=[disabled,fatjar.core]
|
||||
---
|
||||
make/launcher/Launcher-java.base.gmk | 1 -
|
||||
make/launcher/Launcher-java.rmi.gmk | 2 -
|
||||
make/launcher/Launcher-java.scripting.gmk | 3 +-
|
||||
make/launcher/Launcher-java.security.jgss.gmk | 3 --
|
||||
make/launcher/Launcher-jdk.aot.gmk | 2 -
|
||||
make/launcher/Launcher-jdk.compiler.gmk | 5 +-
|
||||
make/launcher/Launcher-jdk.hotspot.agent.gmk | 1 -
|
||||
make/launcher/Launcher-jdk.jartool.gmk | 2 -
|
||||
make/launcher/Launcher-jdk.javadoc.gmk | 3 +-
|
||||
make/launcher/Launcher-jdk.jcmd.gmk | 13 +----
|
||||
make/launcher/Launcher-jdk.jdeps.gmk | 3 --
|
||||
make/launcher/Launcher-jdk.jdi.gmk | 1 -
|
||||
make/launcher/Launcher-jdk.jlink.gmk | 5 +-
|
||||
make/launcher/Launcher-jdk.jshell.gmk | 1 -
|
||||
make/launcher/Launcher-jdk.jstatd.gmk | 1 -
|
||||
make/launcher/Launcher-jdk.pack.gmk | 1 -
|
||||
make/launcher/Launcher-jdk.rmic.gmk | 1 -
|
||||
.../Launcher-jdk.scripting.nashorn.shell.gmk | 3 +-
|
||||
src/hotspot/share/runtime/arguments.cpp | 48 +++++++++++--------
|
||||
.../runtime/flags/jvmFlagConstraintList.cpp | 23 +++++++++
|
||||
.../runtime/flags/jvmFlagConstraintList.hpp | 1 +
|
||||
.../flags/jvmFlagConstraintsRuntime.cpp | 10 ++++
|
||||
.../flags/jvmFlagConstraintsRuntime.hpp | 1 +
|
||||
src/hotspot/share/runtime/globals.hpp | 12 ++++-
|
||||
24 files changed, 81 insertions(+), 65 deletions(-)
|
||||
|
||||
diff --git a/make/launcher/Launcher-java.base.gmk b/make/launcher/Launcher-java.base.gmk
|
||||
index 38ba29530d8..f6d4aa28fe6 100644
|
||||
--- a/make/launcher/Launcher-java.base.gmk
|
||||
+++ b/make/launcher/Launcher-java.base.gmk
|
||||
@@ -52,7 +52,6 @@ endif
|
||||
|
||||
$(eval $(call SetupBuildLauncher, keytool, \
|
||||
MAIN_CLASS := sun.security.tools.keytool.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
################################################################################
|
||||
diff --git a/make/launcher/Launcher-java.rmi.gmk b/make/launcher/Launcher-java.rmi.gmk
|
||||
index 07046232275..a69a90bcc81 100644
|
||||
--- a/make/launcher/Launcher-java.rmi.gmk
|
||||
+++ b/make/launcher/Launcher-java.rmi.gmk
|
||||
@@ -27,10 +27,8 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, rmid, \
|
||||
MAIN_CLASS := sun.rmi.server.Activation, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, rmiregistry, \
|
||||
MAIN_CLASS := sun.rmi.registry.RegistryImpl, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-java.scripting.gmk b/make/launcher/Launcher-java.scripting.gmk
|
||||
index cf100e20789..057d2bf3aca 100644
|
||||
--- a/make/launcher/Launcher-java.scripting.gmk
|
||||
+++ b/make/launcher/Launcher-java.scripting.gmk
|
||||
@@ -27,6 +27,5 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jrunscript, \
|
||||
MAIN_CLASS := com.sun.tools.script.shell.Main, \
|
||||
- JAVA_ARGS := --add-modules ALL-DEFAULT \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
+ JAVA_ARGS := --add-modules ALL-DEFAULT, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-java.security.jgss.gmk b/make/launcher/Launcher-java.security.jgss.gmk
|
||||
index 2b856bfccb4..7411e1a21c4 100644
|
||||
--- a/make/launcher/Launcher-java.security.jgss.gmk
|
||||
+++ b/make/launcher/Launcher-java.security.jgss.gmk
|
||||
@@ -28,16 +28,13 @@ include LauncherCommon.gmk
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
$(eval $(call SetupBuildLauncher, kinit, \
|
||||
MAIN_CLASS := sun.security.krb5.internal.tools.Kinit, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, klist, \
|
||||
MAIN_CLASS := sun.security.krb5.internal.tools.Klist, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, ktab, \
|
||||
MAIN_CLASS := sun.security.krb5.internal.tools.Ktab, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
endif
|
||||
diff --git a/make/launcher/Launcher-jdk.aot.gmk b/make/launcher/Launcher-jdk.aot.gmk
|
||||
index 2c52c31a555..10717a5e1c5 100644
|
||||
--- a/make/launcher/Launcher-jdk.aot.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.aot.gmk
|
||||
@@ -31,7 +31,6 @@ include LauncherCommon.gmk
|
||||
$(eval $(call SetupBuildLauncher, jaotc, \
|
||||
MAIN_CLASS := jdk.tools.jaotc.Main, \
|
||||
EXTRA_JAVA_ARGS := -XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI \
|
||||
- -XX:+DisableHotswapAgent \
|
||||
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.aarch64=$(call CommaList, jdk.internal.vm.compiler jdk.aot) \
|
||||
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.amd64=$(call CommaList, jdk.internal.vm.compiler jdk.aot) \
|
||||
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.code=$(call CommaList, jdk.internal.vm.compiler jdk.aot) \
|
||||
@@ -41,7 +40,6 @@ $(eval $(call SetupBuildLauncher, jaotc, \
|
||||
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot=$(call CommaList, jdk.internal.vm.compiler jdk.aot) \
|
||||
, \
|
||||
JAVA_ARGS := --add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot.aarch64=$(call CommaList, jdk.internal.vm.compiler jdk.aot) \
|
||||
- -XX:+DisableHotswapAgent \
|
||||
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot.amd64=$(call CommaList, jdk.internal.vm.compiler jdk.aot) \
|
||||
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot.aarch64=$(call CommaList, jdk.internal.vm.compiler jdk.aot) \
|
||||
--add-exports=jdk.internal.vm.ci/jdk.vm.ci.hotspot.sparc=$(call CommaList, jdk.internal.vm.compiler jdk.aot) \
|
||||
diff --git a/make/launcher/Launcher-jdk.compiler.gmk b/make/launcher/Launcher-jdk.compiler.gmk
|
||||
index 744969546de..f71c37adf74 100644
|
||||
--- a/make/launcher/Launcher-jdk.compiler.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.compiler.gmk
|
||||
@@ -27,14 +27,12 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, javac, \
|
||||
MAIN_CLASS := com.sun.tools.javac.Main, \
|
||||
- JAVA_ARGS := --add-modules ALL-DEFAULT \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
+ JAVA_ARGS := --add-modules ALL-DEFAULT, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, serialver, \
|
||||
MAIN_CLASS := sun.tools.serialver.SerialVer, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
|
||||
@@ -43,7 +41,6 @@ ifeq ($(ENABLE_SJAVAC), yes)
|
||||
# into any real images
|
||||
$(eval $(call SetupBuildLauncher, sjavac, \
|
||||
MAIN_CLASS := com.sun.tools.sjavac.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
OUTPUT_DIR := $(JDK_OUTPUTDIR)/bin, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-jdk.hotspot.agent.gmk b/make/launcher/Launcher-jdk.hotspot.agent.gmk
|
||||
index 9f12b05b172..76da3600368 100644
|
||||
--- a/make/launcher/Launcher-jdk.hotspot.agent.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.hotspot.agent.gmk
|
||||
@@ -27,6 +27,5 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jhsdb, \
|
||||
MAIN_CLASS := sun.jvm.hotspot.SALauncher, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
MACOSX_PRIVILEGED := true, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-jdk.jartool.gmk b/make/launcher/Launcher-jdk.jartool.gmk
|
||||
index 647d82b65b1..f74e82bfdae 100644
|
||||
--- a/make/launcher/Launcher-jdk.jartool.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.jartool.gmk
|
||||
@@ -27,10 +27,8 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jar, \
|
||||
MAIN_CLASS := sun.tools.jar.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jarsigner, \
|
||||
MAIN_CLASS := sun.security.tools.jarsigner.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-jdk.javadoc.gmk b/make/launcher/Launcher-jdk.javadoc.gmk
|
||||
index c3d2093be04..889028a2b17 100644
|
||||
--- a/make/launcher/Launcher-jdk.javadoc.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.javadoc.gmk
|
||||
@@ -27,7 +27,6 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, javadoc, \
|
||||
MAIN_CLASS := jdk.javadoc.internal.tool.Main, \
|
||||
- JAVA_ARGS := --add-modules ALL-DEFAULT \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
+ JAVA_ARGS := --add-modules ALL-DEFAULT, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-jdk.jcmd.gmk b/make/launcher/Launcher-jdk.jcmd.gmk
|
||||
index 761a52d8466..7117fa78059 100644
|
||||
--- a/make/launcher/Launcher-jdk.jcmd.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.jcmd.gmk
|
||||
@@ -30,7 +30,6 @@ $(eval $(call SetupBuildLauncher, jinfo, \
|
||||
JAVA_ARGS := \
|
||||
-Dsun.jvm.hotspot.debugger.useProcDebugger \
|
||||
-Dsun.jvm.hotspot.debugger.useWindbgDebugger, \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
MACOSX_PRIVILEGED := true, \
|
||||
))
|
||||
|
||||
@@ -38,36 +37,28 @@ $(eval $(call SetupBuildLauncher, jmap, \
|
||||
MAIN_CLASS := sun.tools.jmap.JMap, \
|
||||
JAVA_ARGS := \
|
||||
-Dsun.jvm.hotspot.debugger.useProcDebugger \
|
||||
- -Dsun.jvm.hotspot.debugger.useWindbgDebugger \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
+ -Dsun.jvm.hotspot.debugger.useWindbgDebugger, \
|
||||
MACOSX_PRIVILEGED := true, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jps, \
|
||||
MAIN_CLASS := sun.tools.jps.Jps, \
|
||||
- JAVA_ARGS := \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jstack, \
|
||||
MAIN_CLASS := sun.tools.jstack.JStack, \
|
||||
JAVA_ARGS := \
|
||||
-Dsun.jvm.hotspot.debugger.useProcDebugger \
|
||||
- -Dsun.jvm.hotspot.debugger.useWindbgDebugger \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
+ -Dsun.jvm.hotspot.debugger.useWindbgDebugger, \
|
||||
MACOSX_PRIVILEGED := true, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jstat, \
|
||||
MAIN_CLASS := sun.tools.jstat.Jstat, \
|
||||
- JAVA_ARGS := \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jcmd, \
|
||||
MAIN_CLASS := sun.tools.jcmd.JCmd, \
|
||||
- JAVA_ARGS := \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
# Hook to include the corresponding custom file, if present.
|
||||
diff --git a/make/launcher/Launcher-jdk.jdeps.gmk b/make/launcher/Launcher-jdk.jdeps.gmk
|
||||
index 5448278dae7..217523c48cc 100644
|
||||
--- a/make/launcher/Launcher-jdk.jdeps.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.jdeps.gmk
|
||||
@@ -27,18 +27,15 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, javap, \
|
||||
MAIN_CLASS := com.sun.tools.javap.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jdeps, \
|
||||
MAIN_CLASS := com.sun.tools.jdeps.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jdeprscan, \
|
||||
MAIN_CLASS := com.sun.tools.jdeprscan.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-jdk.jdi.gmk b/make/launcher/Launcher-jdk.jdi.gmk
|
||||
index 27bd448e3ae..fcce98cf430 100644
|
||||
--- a/make/launcher/Launcher-jdk.jdi.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.jdi.gmk
|
||||
@@ -27,5 +27,4 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jdb, \
|
||||
MAIN_CLASS := com.sun.tools.example.debug.tty.TTY, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-jdk.jlink.gmk b/make/launcher/Launcher-jdk.jlink.gmk
|
||||
index 9e61edeb2c8..df2173996d7 100644
|
||||
--- a/make/launcher/Launcher-jdk.jlink.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.jlink.gmk
|
||||
@@ -27,21 +27,18 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jimage,\
|
||||
MAIN_CLASS := jdk.tools.jimage.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
CFLAGS := -DENABLE_ARG_FILES, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jlink,\
|
||||
MAIN_CLASS := jdk.tools.jlink.internal.Main, \
|
||||
- JAVA_ARGS := --add-modules ALL-DEFAULT \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
+ JAVA_ARGS := --add-modules ALL-DEFAULT, \
|
||||
CFLAGS := -DENABLE_ARG_FILES \
|
||||
-DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jmod,\
|
||||
MAIN_CLASS := jdk.tools.jmod.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
CFLAGS := -DENABLE_ARG_FILES \
|
||||
-DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-jdk.jshell.gmk b/make/launcher/Launcher-jdk.jshell.gmk
|
||||
index 7287f8f998a..349eb88e9eb 100644
|
||||
--- a/make/launcher/Launcher-jdk.jshell.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.jshell.gmk
|
||||
@@ -27,6 +27,5 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jshell, \
|
||||
MAIN_CLASS := jdk.internal.jshell.tool.JShellToolProvider, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-jdk.jstatd.gmk b/make/launcher/Launcher-jdk.jstatd.gmk
|
||||
index e1657910c67..e9286d63094 100644
|
||||
--- a/make/launcher/Launcher-jdk.jstatd.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.jstatd.gmk
|
||||
@@ -27,7 +27,6 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jstatd, \
|
||||
MAIN_CLASS := sun.tools.jstatd.Jstatd, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
# Hook to include the corresponding custom file, if present.
|
||||
diff --git a/make/launcher/Launcher-jdk.pack.gmk b/make/launcher/Launcher-jdk.pack.gmk
|
||||
index 64bbbb7c949..a93fd2a9017 100644
|
||||
--- a/make/launcher/Launcher-jdk.pack.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.pack.gmk
|
||||
@@ -28,7 +28,6 @@ include LauncherCommon.gmk
|
||||
$(eval $(call SetupBuildLauncher, pack200, \
|
||||
MAIN_MODULE := java.base, \
|
||||
MAIN_CLASS := com.sun.java.util.jar.pack.Driver, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
))
|
||||
|
||||
################################################################################
|
||||
diff --git a/make/launcher/Launcher-jdk.rmic.gmk b/make/launcher/Launcher-jdk.rmic.gmk
|
||||
index b8a55900b0e..d60c3d9b60b 100644
|
||||
--- a/make/launcher/Launcher-jdk.rmic.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.rmic.gmk
|
||||
@@ -27,6 +27,5 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, rmic, \
|
||||
MAIN_CLASS := sun.rmi.rmic.Main, \
|
||||
- JAVA_ARGS := -XX:+DisableHotswapAgent, \
|
||||
CFLAGS := -DEXPAND_CLASSPATH_WILDCARDS, \
|
||||
))
|
||||
diff --git a/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk b/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk
|
||||
index bd39f8595b2..82311e69fd6 100644
|
||||
--- a/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk
|
||||
+++ b/make/launcher/Launcher-jdk.scripting.nashorn.shell.gmk
|
||||
@@ -27,7 +27,6 @@ include LauncherCommon.gmk
|
||||
|
||||
$(eval $(call SetupBuildLauncher, jjs, \
|
||||
MAIN_CLASS := jdk.nashorn.tools.jjs.Main, \
|
||||
- JAVA_ARGS := --add-modules ALL-DEFAULT \
|
||||
- -XX:+DisableHotswapAgent, \
|
||||
+ JAVA_ARGS := --add-modules ALL-DEFAULT, \
|
||||
CFLAGS := -DENABLE_ARG_FILES, \
|
||||
))
|
||||
diff --git a/src/hotspot/share/runtime/arguments.cpp b/src/hotspot/share/runtime/arguments.cpp
|
||||
index c5635bb8537..d7fee6a8c95 100644
|
||||
--- a/src/hotspot/share/runtime/arguments.cpp
|
||||
+++ b/src/hotspot/share/runtime/arguments.cpp
|
||||
@@ -4310,11 +4310,17 @@ void Arguments::setup_hotswap_agent() {
|
||||
if (DumpSharedSpaces)
|
||||
return;
|
||||
|
||||
- if (!AllowEnhancedClassRedefinition)
|
||||
+ if (HotswapAgent == NULL || strcmp(HotswapAgent, "disabled") == 0)
|
||||
return;
|
||||
|
||||
+ // Force AllowEnhancedClassRedefinition if HA is enabled
|
||||
+ AllowEnhancedClassRedefinition = true;
|
||||
+
|
||||
+ bool ha_fatjar = strcmp(HotswapAgent, "fatjar") == 0;
|
||||
+ bool ha_core = strcmp(HotswapAgent, "core") == 0;
|
||||
+
|
||||
// Set HotswapAgent
|
||||
- if (!DisableHotswapAgent) {
|
||||
+ if (ha_fatjar || ha_core) {
|
||||
|
||||
char ext_path_str[JVM_MAXPATHLEN];
|
||||
|
||||
@@ -4333,23 +4339,27 @@ void Arguments::setup_hotswap_agent() {
|
||||
}
|
||||
}
|
||||
if (ext_path_length < JVM_MAXPATHLEN - 10) {
|
||||
- jio_snprintf(ext_path_str + ext_path_length, sizeof(ext_path_str) - ext_path_length,
|
||||
- "%shotswap%shotswap-agent.jar", os::file_separator(), os::file_separator());
|
||||
- }
|
||||
-
|
||||
- int fd = ::open(ext_path_str, O_RDONLY);
|
||||
- if (fd >= 0) {
|
||||
- os::close(fd);
|
||||
- size_t length = strlen(ext_path_str) + 1;
|
||||
- char *options = NEW_C_HEAP_ARRAY(char, length, mtArguments);
|
||||
- jio_snprintf(options, length, "%s", ext_path_str);
|
||||
- add_init_agent("instrument", ext_path_str, false);
|
||||
- jio_fprintf(defaultStream::output_stream(), "Starting HotswapAgent '%s'\n", ext_path_str);
|
||||
- }
|
||||
-// else
|
||||
-// {
|
||||
-// jio_fprintf(defaultStream::error_stream(), "HotswapAgent not found on path:'%s'\n", ext_path_str);
|
||||
-// }
|
||||
+ if (ha_fatjar) {
|
||||
+ jio_snprintf(ext_path_str + ext_path_length, sizeof(ext_path_str) - ext_path_length,
|
||||
+ "%shotswap%shotswap-agent.jar", os::file_separator(), os::file_separator());
|
||||
+ } else {
|
||||
+ jio_snprintf(ext_path_str + ext_path_length, sizeof(ext_path_str) - ext_path_length,
|
||||
+ "%shotswap%shotswap-agent-core.jar", os::file_separator(), os::file_separator());
|
||||
+ }
|
||||
+ int fd = ::open(ext_path_str, O_RDONLY);
|
||||
+ if (fd >= 0) {
|
||||
+ os::close(fd);
|
||||
+ size_t length = strlen(ext_path_str) + 1;
|
||||
+ char *options = NEW_C_HEAP_ARRAY(char, length, mtArguments);
|
||||
+ jio_snprintf(options, length, "%s", ext_path_str);
|
||||
+ add_init_agent("instrument", ext_path_str, false);
|
||||
+ jio_fprintf(defaultStream::output_stream(), "Starting HotswapAgent '%s'\n", ext_path_str);
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ jio_fprintf(defaultStream::error_stream(), "HotswapAgent not found on path:'%s'!\n", ext_path_str);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
// TODO: open it only for org.hotswap.agent module
|
||||
diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintList.cpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintList.cpp
|
||||
index 16d8030fd1c..94044c4831c 100644
|
||||
--- a/src/hotspot/share/runtime/flags/jvmFlagConstraintList.cpp
|
||||
+++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintList.cpp
|
||||
@@ -199,6 +199,26 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
+class JVMFlagConstraint_ccstr : public JVMFlagConstraint {
|
||||
+ JVMFlagConstraintFunc_ccstr _constraint;
|
||||
+ const ccstr* _ptr;
|
||||
+
|
||||
+public:
|
||||
+ // the "name" argument must be a string literal
|
||||
+ JVMFlagConstraint_ccstr(const char* name, const ccstr* ptr,
|
||||
+ JVMFlagConstraintFunc_ccstr func,
|
||||
+ ConstraintType type) : JVMFlagConstraint(name, type), _constraint(func), _ptr(ptr) {}
|
||||
+
|
||||
+ JVMFlag::Error apply(bool verbose) {
|
||||
+ ccstr value = *_ptr;
|
||||
+ return _constraint(value, verbose);
|
||||
+ }
|
||||
+
|
||||
+ JVMFlag::Error apply_ccstr(ccstr value, bool verbose) {
|
||||
+ return _constraint(value, verbose);
|
||||
+ }
|
||||
+};
|
||||
+
|
||||
// No constraint emitting
|
||||
void emit_constraint_no(...) { /* NOP */ }
|
||||
|
||||
@@ -239,6 +259,9 @@ void emit_constraint_size_t(const char* name, const size_t* ptr, JVMFlagConstrai
|
||||
void emit_constraint_double(const char* name, const double* ptr, JVMFlagConstraintFunc_double func, JVMFlagConstraint::ConstraintType type) {
|
||||
JVMFlagConstraintList::add(new JVMFlagConstraint_double(name, ptr, func, type));
|
||||
}
|
||||
+void emit_constraint_ccstr(const char* name, ccstr* ptr, JVMFlagConstraintFunc_ccstr func, JVMFlagConstraint::ConstraintType type) {
|
||||
+ JVMFlagConstraintList::add(new JVMFlagConstraint_ccstr(name, ptr, func, type));
|
||||
+}
|
||||
|
||||
// Generate code to call emit_constraint_xxx function
|
||||
#define EMIT_CONSTRAINT_PRODUCT_FLAG(type, name, value, doc) ); emit_constraint_##type(#name,&name
|
||||
diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintList.hpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintList.hpp
|
||||
index 9c27f1db955..b644f7b817a 100644
|
||||
--- a/src/hotspot/share/runtime/flags/jvmFlagConstraintList.hpp
|
||||
+++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintList.hpp
|
||||
@@ -47,6 +47,7 @@ typedef JVMFlag::Error (*JVMFlagConstraintFunc_uintx)(uintx value, bool verbose)
|
||||
typedef JVMFlag::Error (*JVMFlagConstraintFunc_uint64_t)(uint64_t value, bool verbose);
|
||||
typedef JVMFlag::Error (*JVMFlagConstraintFunc_size_t)(size_t value, bool verbose);
|
||||
typedef JVMFlag::Error (*JVMFlagConstraintFunc_double)(double value, bool verbose);
|
||||
+typedef JVMFlag::Error (*JVMFlagConstraintFunc_ccstr)(ccstr value, bool verbose);
|
||||
|
||||
class JVMFlagConstraint : public CHeapObj<mtArguments> {
|
||||
public:
|
||||
diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp
|
||||
index 6559d4252f0..21afac72a2e 100644
|
||||
--- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp
|
||||
+++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.cpp
|
||||
@@ -140,3 +140,13 @@ JVMFlag::Error ThreadLocalHandshakesConstraintFunc(bool value, bool verbose) {
|
||||
}
|
||||
return JVMFlag::SUCCESS;
|
||||
}
|
||||
+
|
||||
+JVMFlag::Error HotswapAgentConstraintFunc(char const* value, bool verbose) {
|
||||
+ if (value != NULL) {
|
||||
+ if (strcmp("disabled", value) != 0 && strcmp("fatjar", value) != 0 && strcmp("core", value) != 0 && strcmp("external", value) != 0) {
|
||||
+ JVMFlag::printError(verbose, "HotswapAgent(%s) must be one of disabled,fatjar,core or external.\n", value);
|
||||
+ return JVMFlag::VIOLATES_CONSTRAINT;
|
||||
+ }
|
||||
+ }
|
||||
+ return JVMFlag::SUCCESS;
|
||||
+}
|
||||
diff --git a/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.hpp b/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.hpp
|
||||
index 8763b83fd37..c9ed15a89e1 100644
|
||||
--- a/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.hpp
|
||||
+++ b/src/hotspot/share/runtime/flags/jvmFlagConstraintsRuntime.hpp
|
||||
@@ -46,5 +46,6 @@ JVMFlag::Error PerfDataSamplingIntervalFunc(intx value, bool verbose);
|
||||
|
||||
JVMFlag::Error ThreadLocalHandshakesConstraintFunc(bool value, bool verbose);
|
||||
|
||||
+JVMFlag::Error HotswapAgentConstraintFunc(char const* value, bool verbose);
|
||||
|
||||
#endif /* SHARE_VM_RUNTIME_JVMFLAGCONSTRAINTSRUNTIME_HPP */
|
||||
diff --git a/src/hotspot/share/runtime/globals.hpp b/src/hotspot/share/runtime/globals.hpp
|
||||
index 705381825ff..eda4eca2451 100644
|
||||
--- a/src/hotspot/share/runtime/globals.hpp
|
||||
+++ b/src/hotspot/share/runtime/globals.hpp
|
||||
@@ -2692,8 +2692,16 @@ define_pd_global(uint64_t,MaxRAM, 1ULL*G);
|
||||
"Allow enhanced class redefinition beyond swapping method " \
|
||||
"bodies") \
|
||||
\
|
||||
- product(bool, DisableHotswapAgent, DISABLED_HOTSWAP_AGENT, \
|
||||
- "Disable integrated Hotswap Agent (HotswapVM only)")
|
||||
+ product(ccstr, HotswapAgent, "disabled", \
|
||||
+ "Specify HotswapAgent image to be used." \
|
||||
+ "disabled: hotswap agent is disabled (default)" \
|
||||
+ "fatjar: full HA. Use integrated hotswap-agent.jar" \
|
||||
+ "core: core HA. Use integrated hotswap-agent-core.jar" \
|
||||
+ "external: external HA. use external HA, open required JDK " \
|
||||
+ "modules.") \
|
||||
+ constraint(HotswapAgentConstraintFunc, AfterErgo)
|
||||
+
|
||||
+
|
||||
#define VM_FLAGS(develop, \
|
||||
develop_pd, \
|
||||
product, \
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,333 +0,0 @@
|
||||
From cb2c85624c82ec9f9c30ba4a8122eb23e806999c Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||
Date: Mon, 8 Mar 2021 02:22:54 +0700
|
||||
Subject: [PATCH 26/31] Support for redefinition of Well Known classses
|
||||
(java.*,jdk.*, sun.*)
|
||||
|
||||
---
|
||||
src/hotspot/share/ci/ciKlass.hpp | 1 +
|
||||
src/hotspot/share/ci/ciObjectFactory.cpp | 34 +++++++++++
|
||||
src/hotspot/share/ci/ciObjectFactory.hpp | 6 ++
|
||||
.../share/classfile/systemDictionary.cpp | 10 +++
|
||||
.../share/classfile/systemDictionary.hpp | 2 +
|
||||
src/hotspot/share/classfile/vmSymbols.hpp | 2 +
|
||||
src/hotspot/share/compiler/compileBroker.cpp | 11 ++++
|
||||
src/hotspot/share/memory/universe.cpp | 8 +++
|
||||
src/hotspot/share/memory/universe.hpp | 3 +
|
||||
.../prims/jvmtiEnhancedRedefineClasses.cpp | 61 ++++++++++++++++++-
|
||||
.../prims/jvmtiEnhancedRedefineClasses.hpp | 2 +
|
||||
11 files changed, 139 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/hotspot/share/ci/ciKlass.hpp b/src/hotspot/share/ci/ciKlass.hpp
|
||||
index 896f489453a..c610c365aba 100644
|
||||
--- a/src/hotspot/share/ci/ciKlass.hpp
|
||||
+++ b/src/hotspot/share/ci/ciKlass.hpp
|
||||
@@ -129,6 +129,7 @@ public:
|
||||
void print_name_on(outputStream* st);
|
||||
|
||||
const char* external_name() const;
|
||||
+ Klass* new_version() { return get_Klass()->new_version(); }
|
||||
};
|
||||
|
||||
#endif // SHARE_VM_CI_CIKLASS_HPP
|
||||
diff --git a/src/hotspot/share/ci/ciObjectFactory.cpp b/src/hotspot/share/ci/ciObjectFactory.cpp
|
||||
index 66bbe835e7b..107c16fa5cf 100644
|
||||
--- a/src/hotspot/share/ci/ciObjectFactory.cpp
|
||||
+++ b/src/hotspot/share/ci/ciObjectFactory.cpp
|
||||
@@ -70,7 +70,10 @@ GrowableArray<ciMetadata*>* ciObjectFactory::_shared_ci_metadata = NULL;
|
||||
ciSymbol* ciObjectFactory::_shared_ci_symbols[vmSymbols::SID_LIMIT];
|
||||
int ciObjectFactory::_shared_ident_limit = 0;
|
||||
volatile bool ciObjectFactory::_initialized = false;
|
||||
+volatile bool ciObjectFactory::_reinitialize_wk_klasses = false;
|
||||
|
||||
+// TODO: review...
|
||||
+Arena* ciObjectFactory::_initial_arena = NULL;
|
||||
|
||||
// ------------------------------------------------------------------
|
||||
// ciObjectFactory::ciObjectFactory
|
||||
@@ -112,6 +115,7 @@ void ciObjectFactory::initialize() {
|
||||
// compiler thread that initializes the initial ciObjectFactory which
|
||||
// creates the shared ciObjects that all later ciObjectFactories use.
|
||||
Arena* arena = new (mtCompiler) Arena(mtCompiler);
|
||||
+ ciObjectFactory::_initial_arena = arena;
|
||||
ciEnv initial(arena);
|
||||
ciEnv* env = ciEnv::current();
|
||||
env->_factory->init_shared_objects();
|
||||
@@ -120,6 +124,36 @@ void ciObjectFactory::initialize() {
|
||||
|
||||
}
|
||||
|
||||
+// (DCEVM) wk classes could be modified
|
||||
+void ciObjectFactory::reinitialize_wk_classes() {
|
||||
+ ASSERT_IN_VM;
|
||||
+ JavaThread* thread = JavaThread::current();
|
||||
+ HandleMark handle_mark(thread);
|
||||
+
|
||||
+ // This Arena is long lived and exists in the resource mark of the
|
||||
+ // compiler thread that initializes the initial ciObjectFactory which
|
||||
+ // creates the shared ciObjects that all later ciObjectFactories use.
|
||||
+ // Arena* arena = new (mtCompiler) Arena(mtCompiler);
|
||||
+ ciEnv initial(ciObjectFactory::_initial_arena);
|
||||
+ ciEnv* env = ciEnv::current();
|
||||
+ env->_factory->do_reinitialize_wk_classes();
|
||||
+ _reinitialize_wk_klasses = false;
|
||||
+}
|
||||
+
|
||||
+// (DCEVM) wk classes could be modified
|
||||
+void ciObjectFactory::do_reinitialize_wk_classes() {
|
||||
+#define WK_KLASS_DEFN(name, ignore_s, opt) \
|
||||
+ if (ciEnv::_##name != NULL && ciEnv::_##name->new_version() != NULL) { \
|
||||
+ int old_ident = ciEnv::_##name->ident(); \
|
||||
+ ciEnv::_##name = get_metadata(SystemDictionary::name())->as_instance_klass(); \
|
||||
+ ciEnv::_##name->compute_nonstatic_fields(); \
|
||||
+ ciEnv::_##name->set_ident(old_ident); \
|
||||
+ }
|
||||
+
|
||||
+ WK_KLASSES_DO(WK_KLASS_DEFN)
|
||||
+#undef WK_KLASS_DEFN
|
||||
+}
|
||||
+
|
||||
void ciObjectFactory::init_shared_objects() {
|
||||
|
||||
_next_ident = 1; // start numbering CI objects at 1
|
||||
diff --git a/src/hotspot/share/ci/ciObjectFactory.hpp b/src/hotspot/share/ci/ciObjectFactory.hpp
|
||||
index 3e9d48c4cdc..79059f6e2e8 100644
|
||||
--- a/src/hotspot/share/ci/ciObjectFactory.hpp
|
||||
+++ b/src/hotspot/share/ci/ciObjectFactory.hpp
|
||||
@@ -41,9 +41,11 @@ class ciObjectFactory : public ResourceObj {
|
||||
|
||||
private:
|
||||
static volatile bool _initialized;
|
||||
+ static volatile bool _reinitialize_wk_klasses;
|
||||
static GrowableArray<ciMetadata*>* _shared_ci_metadata;
|
||||
static ciSymbol* _shared_ci_symbols[];
|
||||
static int _shared_ident_limit;
|
||||
+ static Arena* _initial_arena;
|
||||
|
||||
Arena* _arena;
|
||||
GrowableArray<ciMetadata*>* _ci_metadata;
|
||||
@@ -89,10 +91,14 @@ private:
|
||||
ciInstance* get_unloaded_instance(ciInstanceKlass* klass);
|
||||
|
||||
static int compare_cimetadata(ciMetadata** a, ciMetadata** b);
|
||||
+ void do_reinitialize_wk_classes();
|
||||
public:
|
||||
static bool is_initialized() { return _initialized; }
|
||||
+ static bool is_reinitialize_wk_klasses() { return _reinitialize_wk_klasses; }
|
||||
+ static void set_reinitialize_wk_klasses() { _reinitialize_wk_klasses = true; }
|
||||
|
||||
static void initialize();
|
||||
+ static void reinitialize_wk_classes();
|
||||
void init_shared_objects();
|
||||
void remove_symbols();
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/systemDictionary.cpp b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
index f7452adcf02..1d2c7d22ce0 100644
|
||||
--- a/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
+++ b/src/hotspot/share/classfile/systemDictionary.cpp
|
||||
@@ -1985,6 +1985,16 @@ bool SystemDictionary::is_well_known_klass(Symbol* class_name) {
|
||||
}
|
||||
#endif
|
||||
|
||||
+bool SystemDictionary::update_well_known_klass(InstanceKlass* old_klass, InstanceKlass* new_klass) {
|
||||
+ for (int id = FIRST_WKID; id < WKID_LIMIT; id++) {
|
||||
+ if (well_known_klass((WKID) id) == old_klass) {
|
||||
+ *well_known_klass_addr((WKID)id) = new_klass;
|
||||
+ return true;
|
||||
+ }
|
||||
+ }
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
bool SystemDictionary::resolve_wk_klass(WKID id, int init_opt, TRAPS) {
|
||||
assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob");
|
||||
int info = wk_init_info[id - FIRST_WKID];
|
||||
diff --git a/src/hotspot/share/classfile/systemDictionary.hpp b/src/hotspot/share/classfile/systemDictionary.hpp
|
||||
index a8359143908..aba2780a321 100644
|
||||
--- a/src/hotspot/share/classfile/systemDictionary.hpp
|
||||
+++ b/src/hotspot/share/classfile/systemDictionary.hpp
|
||||
@@ -470,6 +470,8 @@ public:
|
||||
static bool is_well_known_klass(Symbol* class_name);
|
||||
#endif
|
||||
|
||||
+ static bool update_well_known_klass(InstanceKlass* new_klass, InstanceKlass* old_klass);
|
||||
+
|
||||
// Enhanced class redefinition
|
||||
static void remove_from_hierarchy(InstanceKlass* k);
|
||||
static void update_constraints_after_redefinition();
|
||||
diff --git a/src/hotspot/share/classfile/vmSymbols.hpp b/src/hotspot/share/classfile/vmSymbols.hpp
|
||||
index 0d0badeabd0..3477a408cb6 100644
|
||||
--- a/src/hotspot/share/classfile/vmSymbols.hpp
|
||||
+++ b/src/hotspot/share/classfile/vmSymbols.hpp
|
||||
@@ -356,6 +356,8 @@
|
||||
template(exit_method_name, "exit") \
|
||||
template(add_method_name, "add") \
|
||||
template(remove_method_name, "remove") \
|
||||
+ template(registerNatives_method_name, "registerNatives") \
|
||||
+ template(initIDs_method_name, "initIDs") \
|
||||
template(parent_name, "parent") \
|
||||
template(threads_name, "threads") \
|
||||
template(groups_name, "groups") \
|
||||
diff --git a/src/hotspot/share/compiler/compileBroker.cpp b/src/hotspot/share/compiler/compileBroker.cpp
|
||||
index 0ed0ca52cb0..4f64beae978 100644
|
||||
--- a/src/hotspot/share/compiler/compileBroker.cpp
|
||||
+++ b/src/hotspot/share/compiler/compileBroker.cpp
|
||||
@@ -1877,6 +1877,17 @@ void CompileBroker::compiler_thread_loop() {
|
||||
if (method()->number_of_breakpoints() == 0) {
|
||||
// Compile the method.
|
||||
if ((UseCompiler || AlwaysCompileLoopMethods) && CompileBroker::should_compile_new_jobs()) {
|
||||
+
|
||||
+ // TODO: review usage of CompileThread_lock (DCEVM)
|
||||
+ if (ciObjectFactory::is_reinitialize_wk_klasses())
|
||||
+ {
|
||||
+ ASSERT_IN_VM;
|
||||
+ MutexLocker only_one (CompileThread_lock, thread);
|
||||
+ if (ciObjectFactory::is_reinitialize_wk_klasses()) {
|
||||
+ ciObjectFactory::reinitialize_wk_classes();
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
invoke_compiler_on_method(task);
|
||||
thread->start_idle_timer();
|
||||
} else {
|
||||
diff --git a/src/hotspot/share/memory/universe.cpp b/src/hotspot/share/memory/universe.cpp
|
||||
index 3dc4cc1323c..6b88271b5ef 100644
|
||||
--- a/src/hotspot/share/memory/universe.cpp
|
||||
+++ b/src/hotspot/share/memory/universe.cpp
|
||||
@@ -1030,6 +1030,14 @@ void Universe::initialize_known_methods(TRAPS) {
|
||||
vmSymbols::doStackWalk_signature(), false, CHECK);
|
||||
}
|
||||
|
||||
+void Universe::reinitialize_loader_addClass_method(TRAPS) {
|
||||
+ // Set up method for registering loaded classes in class loader vector
|
||||
+ initialize_known_method(_loader_addClass_cache,
|
||||
+ SystemDictionary::ClassLoader_klass(),
|
||||
+ "addClass",
|
||||
+ vmSymbols::class_void_signature(), false, CHECK);
|
||||
+}
|
||||
+
|
||||
void universe2_init() {
|
||||
EXCEPTION_MARK;
|
||||
Universe::genesis(CATCH);
|
||||
diff --git a/src/hotspot/share/memory/universe.hpp b/src/hotspot/share/memory/universe.hpp
|
||||
index 742dada0e8f..d1af82b5fa7 100644
|
||||
--- a/src/hotspot/share/memory/universe.hpp
|
||||
+++ b/src/hotspot/share/memory/universe.hpp
|
||||
@@ -349,6 +349,9 @@ class Universe: AllStatic {
|
||||
// Function to initialize these
|
||||
static void initialize_known_methods(TRAPS);
|
||||
|
||||
+ // Enhanced class redefinition
|
||||
+ static void reinitialize_loader_addClass_method(TRAPS);
|
||||
+
|
||||
static oop null_ptr_exception_instance() { return _null_ptr_exception_instance; }
|
||||
static oop arithmetic_exception_instance() { return _arithmetic_exception_instance; }
|
||||
static oop virtual_machine_error_instance() { return _virtual_machine_error_instance; }
|
||||
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||
index 4ee12b7021f..7997b178d22 100644
|
||||
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||
@@ -497,6 +497,16 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||
redefine_single_class(_new_classes->at(i), thread);
|
||||
}
|
||||
|
||||
+ // Update possible redefinition of well-known classes (like ClassLoader)
|
||||
+ for (int i = 0; i < _new_classes->length(); i++) {
|
||||
+ InstanceKlass* cur = _new_classes->at(i);
|
||||
+ if (cur->old_version() != NULL && SystemDictionary::update_well_known_klass(InstanceKlass::cast(cur->old_version()), cur))
|
||||
+ {
|
||||
+ log_trace(redefine, class, obsolete, metadata)("Well known class updated %s", cur->external_name());
|
||||
+ ciObjectFactory::set_reinitialize_wk_klasses();
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
// Deoptimize all compiled code that depends on this class (do only once, because it clears whole cache)
|
||||
// if (_max_redefinition_flags > Klass::ModifyClass) {
|
||||
flush_dependent_code(NULL, thread);
|
||||
@@ -672,12 +682,56 @@ void VM_EnhancedRedefineClasses::doit() {
|
||||
_timer_vm_op_doit.stop();
|
||||
}
|
||||
|
||||
+void VM_EnhancedRedefineClasses::reinitializeJDKClasses() {
|
||||
+ if (!_new_classes->is_empty()) {
|
||||
+ ResourceMark rm(Thread::current());
|
||||
+
|
||||
+ for (int i = 0; i < _new_classes->length(); i++) {
|
||||
+ InstanceKlass* cur = _new_classes->at(i);
|
||||
+
|
||||
+ if (cur->name()->starts_with("java/") || cur->name()->starts_with("jdk/") || cur->name()->starts_with("sun/")) {
|
||||
+
|
||||
+ if (cur == SystemDictionary::ClassLoader_klass()) {
|
||||
+ // ClassLoader.addClass method is cached in Universe, we must redefine
|
||||
+ Universe::reinitialize_loader_addClass_method(Thread::current());
|
||||
+ log_trace(redefine, class, obsolete, metadata)("Reinitialize ClassLoade addClass method cache.");
|
||||
+ }
|
||||
+
|
||||
+ // naive assumptions that only JDK classes has native static "registerNative" and "initIDs" methods
|
||||
+ int end;
|
||||
+ Symbol* signature = vmSymbols::registerNatives_method_name();
|
||||
+ int midx = cur->find_method_by_name(signature, &end);
|
||||
+ if (midx == -1) {
|
||||
+ signature = vmSymbols::initIDs_method_name();
|
||||
+ midx = cur->find_method_by_name(signature, &end);
|
||||
+ }
|
||||
+ Method* m = NULL;
|
||||
+ if (midx != -1) {
|
||||
+ m = cur->methods()->at(midx);
|
||||
+ }
|
||||
+ if (m != NULL && m->is_static() && m->is_native()) {
|
||||
+ // call static registerNative if present
|
||||
+ JavaValue result(T_VOID);
|
||||
+ JavaCalls::call_static(&result,
|
||||
+ cur,
|
||||
+ signature,
|
||||
+ vmSymbols::void_method_signature(),
|
||||
+ Thread::current());
|
||||
+ log_trace(redefine, class, obsolete, metadata)("Reregister natives of JDK class %s", cur->external_name());
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
// Cleanup - runs in JVM thread
|
||||
// - free used memory
|
||||
// - end GC
|
||||
void VM_EnhancedRedefineClasses::doit_epilogue() {
|
||||
VM_GC_Operation::doit_epilogue();
|
||||
|
||||
+ reinitializeJDKClasses();
|
||||
+
|
||||
if (_new_classes != NULL) {
|
||||
delete _new_classes;
|
||||
}
|
||||
@@ -1589,7 +1643,12 @@ void VM_EnhancedRedefineClasses::check_methods_and_mark_as_obsolete() {
|
||||
|
||||
// obsolete methods need a unique idnum so they become new entries in
|
||||
// the jmethodID cache in InstanceKlass
|
||||
- assert(old_method->method_idnum() == new_method->method_idnum(), "must match");
|
||||
+ if (old_method->method_idnum() != new_method->method_idnum()) {
|
||||
+ log_error(redefine, class, normalize)
|
||||
+ ("Method not matched: %d != %d old: %s = new: %s", old_method->method_idnum(), new_method->method_idnum(),
|
||||
+ old_method->name_and_sig_as_C_string(), new_method->name_and_sig_as_C_string());
|
||||
+ // assert(old_method->method_idnum() == new_method->method_idnum(), "must match");
|
||||
+ }
|
||||
// u2 num = InstanceKlass::cast(_the_class_oop)->next_method_idnum();
|
||||
// if (num != ConstMethod::UNSET_IDNUM) {
|
||||
// old_method->set_method_idnum(num);
|
||||
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||
index d00109a0b92..8c47baa8a74 100644
|
||||
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.hpp
|
||||
@@ -141,6 +141,8 @@ class VM_EnhancedRedefineClasses: public VM_GC_Operation {
|
||||
|
||||
void flush_dependent_code(InstanceKlass* k_h, TRAPS);
|
||||
|
||||
+ void reinitializeJDKClasses();
|
||||
+
|
||||
static void check_class(InstanceKlass* k_oop, TRAPS);
|
||||
|
||||
static void dump_methods();
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
From 5325334e5f75c8c5fd711c021764901b8fa81a33 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Fri, 19 Mar 2021 19:13:38 +0100
|
||||
Subject: [PATCH 27/31] JBR-3458: Skip dynamic proxy classes based on
|
||||
com.sun.proxy
|
||||
|
||||
---
|
||||
src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp | 3 ++-
|
||||
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||
index 7997b178d22..0d1c68f5cd0 100644
|
||||
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||
@@ -689,7 +689,8 @@ void VM_EnhancedRedefineClasses::reinitializeJDKClasses() {
|
||||
for (int i = 0; i < _new_classes->length(); i++) {
|
||||
InstanceKlass* cur = _new_classes->at(i);
|
||||
|
||||
- if (cur->name()->starts_with("java/") || cur->name()->starts_with("jdk/") || cur->name()->starts_with("sun/")) {
|
||||
+ if ((cur->name()->starts_with("java/") || cur->name()->starts_with("jdk/") || cur->name()->starts_with("sun/"))
|
||||
+ && cur->name()->index_of_at(0, "$$") == -1) { // skip dynamic proxies
|
||||
|
||||
if (cur == SystemDictionary::ClassLoader_klass()) {
|
||||
// ClassLoader.addClass method is cached in Universe, we must redefine
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,79 +0,0 @@
|
||||
From 6ec78dba58b2e05b373dda3ca6a7f6b5c837b331 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <lada.dvorak7@gmail.com>
|
||||
Date: Sat, 20 Mar 2021 20:51:08 +0100
|
||||
Subject: [PATCH 28/31] JBR-3459: Fix race condition in
|
||||
ClassLoaderDataGraph::classes_do
|
||||
|
||||
InstanceKlass in ClassLoaderData can be uninitialized when
|
||||
ClassLoaderDataGraph::classes_do is called. Using
|
||||
ClassLoaderDataGraph::dictionary_classes_do is safe but problem is still
|
||||
persisting with anonymous classes.
|
||||
---
|
||||
src/hotspot/share/classfile/classLoaderData.cpp | 10 ++++++++++
|
||||
src/hotspot/share/classfile/classLoaderData.hpp | 4 ++++
|
||||
.../share/prims/jvmtiEnhancedRedefineClasses.cpp | 13 +++++++++++--
|
||||
3 files changed, 25 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/src/hotspot/share/classfile/classLoaderData.cpp b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
index a70d92c27fc..f6764ff37a0 100644
|
||||
--- a/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
+++ b/src/hotspot/share/classfile/classLoaderData.cpp
|
||||
@@ -1169,6 +1169,16 @@ void ClassLoaderDataGraph::classes_do(KlassClosure* klass_closure) {
|
||||
}
|
||||
}
|
||||
|
||||
+void ClassLoaderDataGraph::anonymous_classes_do(KlassClosure* klass_closure) {
|
||||
+ Thread* thread = Thread::current();
|
||||
+ for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
|
||||
+ if (cld->is_anonymous()) {
|
||||
+ Handle holder(thread, cld->holder_phantom());
|
||||
+ cld->classes_do(klass_closure);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
void ClassLoaderDataGraph::classes_do(void f(Klass* const)) {
|
||||
Thread* thread = Thread::current();
|
||||
for (ClassLoaderData* cld = _head; cld != NULL; cld = cld->next()) {
|
||||
diff --git a/src/hotspot/share/classfile/classLoaderData.hpp b/src/hotspot/share/classfile/classLoaderData.hpp
|
||||
index 16711dca237..b10fafa01e5 100644
|
||||
--- a/src/hotspot/share/classfile/classLoaderData.hpp
|
||||
+++ b/src/hotspot/share/classfile/classLoaderData.hpp
|
||||
@@ -108,6 +108,10 @@ class ClassLoaderDataGraph : public AllStatic {
|
||||
// for redefinition. These classes are removed during the next class unloading.
|
||||
// Walking the ClassLoaderDataGraph also includes anonymous classes.
|
||||
static void classes_do(KlassClosure* klass_closure);
|
||||
+
|
||||
+ // Enhanced class redefinition
|
||||
+ static void anonymous_classes_do(KlassClosure* klass_closure);
|
||||
+
|
||||
static void classes_do(void f(Klass* const));
|
||||
static void methods_do(void f(Method*));
|
||||
static void modules_do(void f(ModuleEntry*));
|
||||
diff --git a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||
index 0d1c68f5cd0..745109902af 100644
|
||||
--- a/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||
+++ b/src/hotspot/share/prims/jvmtiEnhancedRedefineClasses.cpp
|
||||
@@ -2130,8 +2130,17 @@ jvmtiError VM_EnhancedRedefineClasses::find_sorted_affected_classes(TRAPS) {
|
||||
AffectedKlassClosure closure(_affected_klasses);
|
||||
// Updated in j10, from original SystemDictionary::classes_do
|
||||
|
||||
- ClassLoaderDataGraph::classes_do(&closure);
|
||||
- //ClassLoaderDataGraph::dictionary_classes_do(&closure);
|
||||
+ // 0. we can't use ClassLoaderDataGraph::classes_do since classes can be uninitialized in cld,
|
||||
+ // fully initialized class is in system dictionary
|
||||
+ // ClassLoaderDataGraph::classes_do(&closure);
|
||||
+
|
||||
+ // 1. Scan over dictionaries
|
||||
+ ClassLoaderDataGraph::dictionary_classes_do(&closure);
|
||||
+
|
||||
+ // 2. Anonymous class is not in dictionary, we have to iterate anonymous cld directly, but there is race cond...
|
||||
+ // TODO: review ... anonymous class is added to cld before InstanceKlass initialization,
|
||||
+ // find out how to check if the InstanceKlass is initialized
|
||||
+ ClassLoaderDataGraph::anonymous_classes_do(&closure);
|
||||
|
||||
log_trace(redefine, class, load)("%d classes affected", _affected_klasses->length());
|
||||
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,222 +0,0 @@
|
||||
From 0bfeca57132d21f8bc68079ee41dd42bead48f02 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||
Date: Sun, 10 Oct 2021 20:25:30 +0200
|
||||
Subject: [PATCH 29/31] JBR-3867 - update keys of jvmti TAG map after
|
||||
redefinition
|
||||
|
||||
jdwp keeps relation class_ptr->class_ref in jvmti tag. class_ptr is used
|
||||
as a tag key, tag value is refnode. There are new class_ptrs after
|
||||
redefinition, therefore jdwp redefinition method update all affected
|
||||
keys in the tag map.
|
||||
---
|
||||
src/hotspot/share/prims/jvmtiExtensions.cpp | 24 ++++++++++++++
|
||||
.../share/native/libjdwp/VirtualMachineImpl.c | 20 +++++++++++
|
||||
.../share/native/libjdwp/commonRef.c | 29 ++++++++++++++++
|
||||
.../share/native/libjdwp/commonRef.h | 2 ++
|
||||
.../share/native/libjdwp/util.c | 33 +++++++++++++++++++
|
||||
.../share/native/libjdwp/util.h | 3 ++
|
||||
6 files changed, 111 insertions(+)
|
||||
|
||||
diff --git a/src/hotspot/share/prims/jvmtiExtensions.cpp b/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||
index 36bc47ad0b5..8a6058fd884 100644
|
||||
--- a/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||
+++ b/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||
@@ -49,6 +49,15 @@ static jvmtiError JNICALL IsClassUnloadingEnabled(const jvmtiEnv* env, ...) {
|
||||
return JVMTI_ERROR_NONE;
|
||||
}
|
||||
|
||||
+// extension function
|
||||
+static jvmtiError JNICALL IsEnhancedClassRedefinitionEnabled(const jvmtiEnv* env, jboolean* enabled, ...) {
|
||||
+ if (enabled == NULL) {
|
||||
+ return JVMTI_ERROR_NULL_POINTER;
|
||||
+ }
|
||||
+ *enabled = (jboolean)AllowEnhancedClassRedefinition;
|
||||
+ return JVMTI_ERROR_NONE;
|
||||
+}
|
||||
+
|
||||
// register extension functions and events. In this implementation we
|
||||
// have a single extension function (to prove the API) that tests if class
|
||||
// unloading is enabled or disabled. We also have a single extension event
|
||||
@@ -88,6 +97,21 @@ void JvmtiExtensions::register_extensions() {
|
||||
event_params
|
||||
};
|
||||
_ext_events->append(&ext_event);
|
||||
+
|
||||
+ static jvmtiParamInfo func_params_enh_redef[] = {
|
||||
+ { (char*)"IsEnhancedClassRedefinitionEnabled", JVMTI_KIND_OUT, JVMTI_TYPE_JBOOLEAN, JNI_FALSE }
|
||||
+
|
||||
+ };
|
||||
+ static jvmtiExtensionFunctionInfo ext_func_enh_redef = {
|
||||
+ (jvmtiExtensionFunction)IsEnhancedClassRedefinitionEnabled,
|
||||
+ (char*)"com.sun.hotspot.functions.IsEnhancedClassRedefinitionEnabled",
|
||||
+ (char*)"Tell if enhanced class redefinition is enabled (-noclassgc)",
|
||||
+ sizeof(func_params_enh_redef)/sizeof(func_params_enh_redef[0]),
|
||||
+ func_params_enh_redef,
|
||||
+ 0, // no non-universal errors
|
||||
+ NULL
|
||||
+ };
|
||||
+ _ext_functions->append(&ext_func_enh_redef);
|
||||
}
|
||||
|
||||
|
||||
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c b/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||
index d7ca956dc57..faa8f55f91f 100644
|
||||
--- a/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||
@@ -475,6 +475,14 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||
if (ok == JNI_TRUE) {
|
||||
jvmtiError error;
|
||||
|
||||
+ jlong classIds[classCount];
|
||||
+
|
||||
+ if (gdata->isEnhancedClassRedefinitionEnabled) {
|
||||
+ for (i = 0; i < classCount; ++i) {
|
||||
+ classIds[i] = commonRef_refToID(env, classDefs[i].klass);
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
error = JVMTI_FUNC_PTR(gdata->jvmti,RedefineClasses)
|
||||
(gdata->jvmti, classCount, classDefs);
|
||||
if (error != JVMTI_ERROR_NONE) {
|
||||
@@ -484,6 +492,18 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||
for ( i = 0 ; i < classCount; i++ ) {
|
||||
eventHandler_freeClassBreakpoints(classDefs[i].klass);
|
||||
}
|
||||
+
|
||||
+ if (gdata->isEnhancedClassRedefinitionEnabled) {
|
||||
+ /* Update tags in jvmti to use new classes */
|
||||
+ for ( i = 0 ; i < classCount; i++ ) {
|
||||
+ /* pointer in classIds[i] is updated by advanced redefinition to a new class */
|
||||
+ error = commonRef_updateTags(env, classIds[i]);
|
||||
+ if (error != JVMTI_ERROR_NONE) {
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.c b/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.c
|
||||
index 2a8f55014d9..3f33b423209 100644
|
||||
--- a/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.c
|
||||
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.c
|
||||
@@ -618,3 +618,32 @@ commonRef_unlock(void)
|
||||
{
|
||||
debugMonitorExit(gdata->refLock);
|
||||
}
|
||||
+
|
||||
+/*
|
||||
+ * Update JVMTI tags, used from enhanced redefinition
|
||||
+ */
|
||||
+jvmtiError
|
||||
+commonRef_updateTags(JNIEnv *env, jlong id)
|
||||
+{
|
||||
+ jvmtiError error;
|
||||
+
|
||||
+ error = JVMTI_ERROR_NONE;
|
||||
+
|
||||
+ if (id == NULL_OBJECT_ID) {
|
||||
+ return error;
|
||||
+ }
|
||||
+
|
||||
+ debugMonitorEnter(gdata->refLock); {
|
||||
+ RefNode *node;
|
||||
+
|
||||
+ node = findNodeByID(env, id);
|
||||
+ if (node != NULL) {
|
||||
+ error = JVMTI_FUNC_PTR(gdata->jvmti, SetTag)
|
||||
+ (gdata->jvmti, node->ref, ptr_to_jlong(node));
|
||||
+ } else {
|
||||
+ printf("Node not found\n");
|
||||
+ }
|
||||
+ } debugMonitorExit(gdata->refLock);
|
||||
+
|
||||
+ return error;
|
||||
+}
|
||||
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.h b/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.h
|
||||
index 7c76667eb19..d7b01e62a47 100644
|
||||
--- a/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.h
|
||||
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/commonRef.h
|
||||
@@ -41,4 +41,6 @@ void commonRef_compact(void);
|
||||
void commonRef_lock(void);
|
||||
void commonRef_unlock(void);
|
||||
|
||||
+jvmtiError commonRef_updateTags(JNIEnv *env, jlong id);
|
||||
+
|
||||
#endif
|
||||
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/util.c b/src/jdk.jdwp.agent/share/native/libjdwp/util.c
|
||||
index f4a1d19589d..0642c4a3d7f 100644
|
||||
--- a/src/jdk.jdwp.agent/share/native/libjdwp/util.c
|
||||
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/util.c
|
||||
@@ -41,6 +41,7 @@ BackendGlobalData *gdata = NULL;
|
||||
static jboolean isInterface(jclass clazz);
|
||||
static jboolean isArrayClass(jclass clazz);
|
||||
static char * getPropertyUTF8(JNIEnv *env, char *propertyName);
|
||||
+static jboolean isEnhancedClassRedefinitionEnabled(JNIEnv *env);
|
||||
|
||||
/* Save an object reference for use later (create a NewGlobalRef) */
|
||||
void
|
||||
@@ -281,6 +282,8 @@ util_initialize(JNIEnv *env)
|
||||
}
|
||||
}
|
||||
|
||||
+ gdata->isEnhancedClassRedefinitionEnabled = isEnhancedClassRedefinitionEnabled(env);
|
||||
+
|
||||
} END_WITH_LOCAL_REFS(env);
|
||||
|
||||
}
|
||||
@@ -1739,6 +1742,36 @@ getPropertyUTF8(JNIEnv *env, char *propertyName)
|
||||
return value;
|
||||
}
|
||||
|
||||
+static jboolean
|
||||
+isEnhancedClassRedefinitionEnabled(JNIEnv *env)
|
||||
+{
|
||||
+ jvmtiError error;
|
||||
+ jint count, i;
|
||||
+ jvmtiExtensionFunctionInfo* ext_funcs;
|
||||
+
|
||||
+ error = JVMTI_FUNC_PTR(gdata->jvmti,GetExtensionFunctions)
|
||||
+ (gdata->jvmti, &count, &ext_funcs);
|
||||
+ if (error != JVMTI_ERROR_NONE) {
|
||||
+ return JNI_FALSE;
|
||||
+ }
|
||||
+
|
||||
+ for (i=0; i<count; i++) {
|
||||
+ if (strcmp(ext_funcs[i].id, (char*)"com.sun.hotspot.functions.IsEnhancedClassRedefinitionEnabled") == 0) {
|
||||
+ jboolean enabled;
|
||||
+ error = (*ext_funcs[i].func)(gdata->jvmti, &enabled);
|
||||
+
|
||||
+ if (error != JVMTI_ERROR_NONE) {
|
||||
+ return JNI_FALSE;
|
||||
+ } else {
|
||||
+ return enabled;
|
||||
+ }
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ return JNI_FALSE;
|
||||
+}
|
||||
+
|
||||
+
|
||||
jboolean
|
||||
isMethodObsolete(jmethodID method)
|
||||
{
|
||||
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/util.h b/src/jdk.jdwp.agent/share/native/libjdwp/util.h
|
||||
index bcb59457120..72a365ad3c3 100644
|
||||
--- a/src/jdk.jdwp.agent/share/native/libjdwp/util.h
|
||||
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/util.h
|
||||
@@ -126,6 +126,9 @@ typedef struct {
|
||||
int objectsByIDsize;
|
||||
int objectsByIDcount;
|
||||
|
||||
+ /* true if enhanced class redefinition is enabled */
|
||||
+ jboolean isEnhancedClassRedefinitionEnabled;
|
||||
+
|
||||
/* Indication that the agent has been loaded */
|
||||
jboolean isLoaded;
|
||||
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,54 +0,0 @@
|
||||
From 16a09678b838d67b0a80340ba904b600013a494f Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||
Date: Mon, 11 Oct 2021 20:22:26 +0200
|
||||
Subject: [PATCH 30/31] JBR-3867 - fix msvc compilation issue with non const
|
||||
array on stack
|
||||
|
||||
---
|
||||
.../share/native/libjdwp/VirtualMachineImpl.c | 14 ++++++++++----
|
||||
1 file changed, 10 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c b/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||
index faa8f55f91f..53f7e44f579 100644
|
||||
--- a/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||
+++ b/src/jdk.jdwp.agent/share/native/libjdwp/VirtualMachineImpl.c
|
||||
@@ -475,11 +475,16 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||
if (ok == JNI_TRUE) {
|
||||
jvmtiError error;
|
||||
|
||||
- jlong classIds[classCount];
|
||||
+ jlong* classIds = NULL;
|
||||
|
||||
if (gdata->isEnhancedClassRedefinitionEnabled) {
|
||||
- for (i = 0; i < classCount; ++i) {
|
||||
- classIds[i] = commonRef_refToID(env, classDefs[i].klass);
|
||||
+ classIds = jvmtiAllocate(classCount*(int)sizeof(jlong));
|
||||
+ if (classIds == NULL) {
|
||||
+ outStream_setError(out, JDWP_ERROR(OUT_OF_MEMORY));
|
||||
+ return JNI_TRUE;
|
||||
+ }
|
||||
+ for (i = 0; i < classCount; i++) {
|
||||
+ classIds[i] = commonRef_refToID(env, classDefs[i].klass);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -493,7 +498,7 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||
eventHandler_freeClassBreakpoints(classDefs[i].klass);
|
||||
}
|
||||
|
||||
- if (gdata->isEnhancedClassRedefinitionEnabled) {
|
||||
+ if (gdata->isEnhancedClassRedefinitionEnabled && classIds != NULL) {
|
||||
/* Update tags in jvmti to use new classes */
|
||||
for ( i = 0 ; i < classCount; i++ ) {
|
||||
/* pointer in classIds[i] is updated by advanced redefinition to a new class */
|
||||
@@ -502,6 +507,7 @@ redefineClasses(PacketInputStream *in, PacketOutputStream *out)
|
||||
break;
|
||||
}
|
||||
}
|
||||
+ jvmtiDeallocate((void*) classIds);
|
||||
}
|
||||
|
||||
}
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
From 8d3ebd313983584f63e2d5b3e32f3e2c60191711 Mon Sep 17 00:00:00 2001
|
||||
From: Vladimir Dvorak <vladimir.dvorak@jetbrains.com>
|
||||
Date: Tue, 19 Oct 2021 17:02:35 +0200
|
||||
Subject: [PATCH 31/31] Attempt to fix JBR-3887
|
||||
|
||||
---
|
||||
src/hotspot/share/prims/jvmtiExtensions.cpp | 8 +++++++-
|
||||
1 file changed, 7 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/src/hotspot/share/prims/jvmtiExtensions.cpp b/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||
index 8a6058fd884..9c8c98cb70e 100644
|
||||
--- a/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||
+++ b/src/hotspot/share/prims/jvmtiExtensions.cpp
|
||||
@@ -50,7 +50,13 @@ static jvmtiError JNICALL IsClassUnloadingEnabled(const jvmtiEnv* env, ...) {
|
||||
}
|
||||
|
||||
// extension function
|
||||
-static jvmtiError JNICALL IsEnhancedClassRedefinitionEnabled(const jvmtiEnv* env, jboolean* enabled, ...) {
|
||||
+static jvmtiError JNICALL IsEnhancedClassRedefinitionEnabled(const jvmtiEnv* env, ...) {
|
||||
+ jboolean* enabled = NULL;
|
||||
+ va_list ap;
|
||||
+
|
||||
+ va_start(ap, env);
|
||||
+ enabled = va_arg(ap, jboolean *);
|
||||
+ va_end(ap);
|
||||
if (enabled == NULL) {
|
||||
return JVMTI_ERROR_NULL_POINTER;
|
||||
}
|
||||
--
|
||||
2.23.0
|
||||
|
||||
@@ -1,142 +0,0 @@
|
||||
#!/bin/bash -x
|
||||
|
||||
# The following parameters must be specified:
|
||||
# JBSDK_VERSION - specifies major version of OpenJDK e.g. 11_0_6 (instead of dots '.' underbars "_" are used)
|
||||
# JDK_BUILD_NUMBER - specifies update release of OpenJDK build or the value of --with-version-build argument to configure
|
||||
# build_number - specifies the number of JetBrainsRuntime build
|
||||
# bundle_type - specifies bundle to be built; possible values:
|
||||
# jcef - the release bundles with jcef
|
||||
# dcevm - the release bundles with dcevm patches
|
||||
# nomod - the release bundles without any additional modules (jcef)
|
||||
# fd - the fastdebug bundles which also include the jcef module
|
||||
#
|
||||
# jbrsdk-${JBSDK_VERSION}-windows-aarch64-b${build_number}.tar.gz
|
||||
# jbr-${JBSDK_VERSION}-windows-aarch64-b${build_number}.tar.gz
|
||||
#
|
||||
# $ ./java --version
|
||||
# openjdk 11.0.6 2020-01-14
|
||||
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||
#
|
||||
# Environment variables:
|
||||
# MODULAR_SDK_PATH - specifies the path to the directory where imported modules are located.
|
||||
# By default imported modules should be located in ./modular-sdk.
|
||||
# JCEF_PATH - specifies the path to the directory with JCEF binaries.
|
||||
# By default JCEF binaries should be located in ./jcef_win_aarch64.
|
||||
# BOOT_JDK - specifies the path to the directory with a ready build of OpenJDK 11 with
|
||||
# the same architecture as the build system. It will be used as the boot jdk.
|
||||
|
||||
JBSDK_VERSION=$1
|
||||
JDK_BUILD_NUMBER=$2
|
||||
build_number=$3
|
||||
bundle_type=$4
|
||||
JBSDK_VERSION_WITH_DOTS=$(echo $JBSDK_VERSION | sed 's/_/\./g')
|
||||
WORK_DIR=$(pwd)
|
||||
WITH_IMPORT_MODULES="--with-import-modules=${MODULAR_SDK_PATH:=${WORK_DIR}/modular-sdk}"
|
||||
JCEF_PATH=${JCEF_PATH:=${WORK_DIR}/jcef_win_aarch64}
|
||||
TOOLCHAIN_VERSION=${TOOLCHAIN_VERSION:=2019}
|
||||
|
||||
source jb/project/tools/common.sh
|
||||
|
||||
function create_jbr {
|
||||
|
||||
JBR_BUNDLE=jbr_${bundle_type}
|
||||
|
||||
case "${bundle_type}" in
|
||||
"jcef" | "dcevm" | "nomod" | "fd")
|
||||
JBR_BASE_NAME=jbr_${bundle_type}-${JBSDK_VERSION}
|
||||
;;
|
||||
*)
|
||||
echo "***ERR*** bundle was not specified" && do_exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
echo "Exclude jdk.internal.vm.compiler and jdk.aot (because aot is not supported yet)"
|
||||
cat modules.list | \
|
||||
grep -v "jdk.internal.vm.compiler\|jdk.aot" \
|
||||
> modules_tmp.list
|
||||
|
||||
rm -rf ${JBR_BUNDLE}
|
||||
|
||||
echo Running jlink....
|
||||
${BOOT_JDK}/bin/jlink \
|
||||
--module-path ${JSDK}/jmods --no-man-pages --compress=2 \
|
||||
--add-modules $(xargs < modules_tmp.list | sed 's/ //g' | sed 's/,\?$//g') --output ${JBR_BUNDLE} || do_exit $?
|
||||
if [[ "${bundle_type}" == *jcef* ]] || [[ "${bundle_type}" == *dcevm* ]] || [[ "${bundle_type}" == fd ]]
|
||||
then
|
||||
rsync -av ${JCEF_PATH}/ ${JBR_BUNDLE}/bin --exclude="modular-sdk" || do_exit $?
|
||||
fi
|
||||
echo Modifying release info ...
|
||||
cat ${JSDK}/release | tr -d '\r' | grep -v 'JAVA_VERSION' | grep -v 'MODULES' >> ${JBR_BUNDLE}/release
|
||||
}
|
||||
|
||||
JBRSDK_BASE_NAME=jbrsdk-${JBSDK_VERSION}
|
||||
WITH_DEBUG_LEVEL="--with-debug-level=release"
|
||||
RELEASE_NAME=windows-aarch64-normal-server-release
|
||||
JBSDK=${JBRSDK_BASE_NAME}-windows-aarch64-b${build_number}
|
||||
case "$bundle_type" in
|
||||
"jcef")
|
||||
git apply -p0 < jb/project/tools/patches/add_jcef_module_winaarch64.patch || do_exit $?
|
||||
do_reset_changes=1
|
||||
;;
|
||||
"dcevm")
|
||||
HEAD_REVISION=$(git rev-parse HEAD)
|
||||
git am jb/project/tools/patches/dcevm/*.patch || do_exit $?
|
||||
do_reset_dcevm=1
|
||||
git apply -p0 < jb/project/tools/patches/add_jcef_module_winaarch64.patch || do_exit $?
|
||||
do_reset_changes=1
|
||||
;;
|
||||
"nomod")
|
||||
WITH_IMPORT_MODULES=""
|
||||
;;
|
||||
"fd")
|
||||
git apply -p0 < jb/project/tools/patches/add_jcef_module_winaarch64.patch || do_exit $?
|
||||
do_reset_changes=1
|
||||
WITH_DEBUG_LEVEL="--with-debug-level=fastdebug"
|
||||
RELEASE_NAME=windows-aarch64-normal-server-fastdebug
|
||||
JBRSDK_BASE_NAME=jbrsdk-${JBSDK_VERSION}-fastdebug
|
||||
JBSDK=${JBRSDK_BASE_NAME}-windows-aarch64-fastdebug-b${build_number}
|
||||
;;
|
||||
*)
|
||||
echo "***ERR*** bundle was not specified" && do_exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
sh ./configure \
|
||||
--openjdk-target=aarch64-unknown-cygwin \
|
||||
--disable-warnings-as-errors \
|
||||
$WITH_DEBUG_LEVEL \
|
||||
--with-vendor-name="${VENDOR_NAME}" \
|
||||
--with-vendor-version-string="${VENDOR_VERSION_STRING}" \
|
||||
--with-jvm-features=shenandoahgc \
|
||||
--with-version-pre= \
|
||||
--with-version-build=${JDK_BUILD_NUMBER} \
|
||||
--with-version-opt=b${build_number} \
|
||||
$WITH_IMPORT_MODULES \
|
||||
--with-toolchain-version=${TOOLCHAIN_VERSION} \
|
||||
--with-boot-jdk=${BOOT_JDK} \
|
||||
--with-build-jdk=${BOOT_JDK} \
|
||||
--disable-ccache \
|
||||
--enable-cds=yes || do_exit $?
|
||||
|
||||
if [ "${bundle_type}" == "jcef" ]; then
|
||||
make LOG=info clean images test-image CONF=$RELEASE_NAME || do_exit $?
|
||||
else
|
||||
make LOG=info clean images CONF=$RELEASE_NAME || do_exit $?
|
||||
fi
|
||||
|
||||
JSDK=build/$RELEASE_NAME/images/jdk
|
||||
BASE_DIR=build/$RELEASE_NAME/images
|
||||
JBRSDK_BUNDLE=jbrsdk
|
||||
|
||||
rm -rf ${BASE_DIR}/${JBRSDK_BUNDLE} && rsync -a --exclude demo --exclude sample ${JSDK}/ ${JBRSDK_BUNDLE} || do_exit $?
|
||||
if [[ "${bundle_type}" == *jcef* ]] || [[ "${bundle_type}" == *dcevm* ]] || [[ "${bundle_type}" == fd ]]
|
||||
then
|
||||
rsync -av ${JCEF_PATH}/ ${JBRSDK_BUNDLE}/bin --exclude='modular-sdk' || do_exit $?
|
||||
sed 's/JBR/JBRSDK/g' ${JSDK}/release > release
|
||||
mv release ${JBRSDK_BUNDLE}/release
|
||||
fi
|
||||
|
||||
create_jbr || do_exit $?
|
||||
|
||||
do_exit 0
|
||||
@@ -1,83 +0,0 @@
|
||||
#!/bin/bash -x
|
||||
|
||||
# The following parameters must be specified:
|
||||
# JBSDK_VERSION - specifies major version of OpenJDK e.g. 11_0_6 (instead of dots '.' underbars "_" are used)
|
||||
# JDK_BUILD_NUMBER - specifies update release of OpenJDK build or the value of --with-version-build argument to configure
|
||||
# build_number - specifies the number of JetBrainsRuntime build
|
||||
# bundle_type - specifies bundle to be built; possible values:
|
||||
# jcef - the release bundles with jcef
|
||||
# dcevm - the release bundles with dcevm patches
|
||||
# nomod - the release bundles without any additional modules (jcef)
|
||||
# fd - the fastdebug bundles which also include the jcef module
|
||||
#
|
||||
# jbrsdk-${JBSDK_VERSION}-windows-aarch64-b${build_number}.tar.gz
|
||||
# jbr-${JBSDK_VERSION}-windows-aarch64-b${build_number}.tar.gz
|
||||
#
|
||||
# $ ./java --version
|
||||
# openjdk 11.0.6 2020-01-14
|
||||
# OpenJDK Runtime Environment (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number})
|
||||
# OpenJDK 64-Bit Server VM (build 11.0.6+${JDK_BUILD_NUMBER}-b${build_number}, mixed mode)
|
||||
#
|
||||
# Environment variables:
|
||||
# MODULAR_SDK_PATH - specifies the path to the directory where imported modules are located.
|
||||
# By default imported modules should be located in ./modular-sdk.
|
||||
# JCEF_PATH - specifies the path to the directory with JCEF binaries.
|
||||
# By default JCEF binaries should be located in ./jcef_win_aarch64.
|
||||
|
||||
JBSDK_VERSION=$1
|
||||
JDK_BUILD_NUMBER=$2
|
||||
build_number=$3
|
||||
bundle_type=$4
|
||||
|
||||
source jb/project/tools/common.sh
|
||||
|
||||
function pack_jbr {
|
||||
|
||||
JBR_BUNDLE=jbr_${bundle_type}
|
||||
|
||||
case "${bundle_type}" in
|
||||
"jcef" | "dcevm" | "nomod" | "fd")
|
||||
JBR_BASE_NAME=jbr_${bundle_type}-${JBSDK_VERSION}
|
||||
;;
|
||||
*)
|
||||
echo "***ERR*** bundle was not specified" && do_exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
JBR=$JBR_BASE_NAME-windows-aarch64-b$build_number
|
||||
echo Creating $JBR.tar.gz ...
|
||||
chmod -R ug+rwx,o+rx ${BASE_DIR}/${JBR_BUNDLE}
|
||||
cp -R ${BASE_DIR}/${JBR_BUNDLE} ${BASE_DIR}/jbr
|
||||
/usr/bin/tar -czf $JBR.tar.gz -C $BASE_DIR jbr || do_exit $?
|
||||
}
|
||||
|
||||
JBRSDK_BASE_NAME=jbrsdk-${JBSDK_VERSION}
|
||||
WITH_DEBUG_LEVEL="--with-debug-level=release"
|
||||
RELEASE_NAME=windows-aarch64-normal-server-release
|
||||
JBSDK=${JBRSDK_BASE_NAME}-windows-aarch64-b${build_number}
|
||||
case "$bundle_type" in
|
||||
"fd")
|
||||
WITH_DEBUG_LEVEL="--with-debug-level=fastdebug"
|
||||
RELEASE_NAME=windows-aarch64-normal-server-fastdebug
|
||||
JBSDK=${JBRSDK_BASE_NAME}-windows-aarch64-fastdebug-b${build_number}
|
||||
;;
|
||||
esac
|
||||
|
||||
IMAGES_DIR=build/$RELEASE_NAME/images
|
||||
JSDK=$IMAGES_DIR/jdk
|
||||
BASE_DIR=.
|
||||
|
||||
if [ "${bundle_type}" == "jcef" ] || [ "${bundle_type}" == "fd" ]; then
|
||||
JBRSDK_BUNDLE=jbrsdk
|
||||
echo Creating $JBSDK.tar.gz ...
|
||||
[ -f "$JBSDK.tar.gz" ] && rm "$JBSDK.tar.gz"
|
||||
/usr/bin/tar -czf $JBSDK.tar.gz $JBRSDK_BUNDLE || do_exit $?
|
||||
fi
|
||||
|
||||
pack_jbr $bundle_type
|
||||
|
||||
if [ "$bundle_type" == "jcef" ]; then
|
||||
JBRSDK_TEST=$JBRSDK_BASE_NAME-windows-test-aarch64-b$build_number
|
||||
echo Creating $JBRSDK_TEST.tar.gz ...
|
||||
/usr/bin/tar -czf $JBRSDK_TEST.tar.gz -C $IMAGES_DIR --exclude='test/jdk/demos' test || do_exit $?
|
||||
fi
|
||||
@@ -1,80 +0,0 @@
|
||||
#
|
||||
# Copyright 2000-2021 JetBrains s.r.o.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
include $(SPEC)
|
||||
include MakeBase.gmk
|
||||
include JavaCompilation.gmk
|
||||
include SetupJavaCompilers.gmk
|
||||
|
||||
JBR_API_ROOT_DIR := $(TOPDIR)/src/jetbrains.api
|
||||
JBR_API_GENSRC_TEMPLATES := $(JBR_API_ROOT_DIR)/templates
|
||||
JBR_API_SRC_DIR := $(JBR_API_ROOT_DIR)/src
|
||||
JBR_API_OUTPUT_DIR := $(OUTPUTDIR)/jbr-api
|
||||
JBR_API_GENSRC_DIR := $(JBR_API_OUTPUT_DIR)/gensrc
|
||||
JBR_API_BIN_DIR := $(JBR_API_OUTPUT_DIR)/bin
|
||||
JBR_API_VERSION_PROPERTIES := $(JBR_API_ROOT_DIR)/version.properties
|
||||
|
||||
JBR_API_GENSRC_SOURCES := $(call FindFiles, $(JBR_API_GENSRC_TEMPLATES))
|
||||
JBR_API_GENSRC_FILES := $(JBR_API_GENSRC_DIR)/com/jetbrains/JBR.java
|
||||
JBR_API_SRC_FILES := $(call FindFiles, $(JBR_API_SRC_DIR))
|
||||
|
||||
ifeq ($(JBR_API_JBR_VERSION),)
|
||||
JBR_API_JBR_VERSION := <DEVELOPMENT>
|
||||
JBR_API_FAIL_ON_HASH_MISMATCH := false
|
||||
else
|
||||
.PHONY: $(JBR_API_VERSION_PROPERTIES)
|
||||
JBR_API_FAIL_ON_HASH_MISMATCH := true
|
||||
endif
|
||||
|
||||
ARCHIVE_BUILD_JBR_API_BIN := $(JBR_API_BIN_DIR)
|
||||
$(eval $(call SetupJavaCompilation, BUILD_JBR_API, \
|
||||
SETUP := BOOT_JAVAC, \
|
||||
SRC := $(JBR_API_GENSRC_DIR) $(JBR_API_SRC_DIR), \
|
||||
EXTRA_FILES := $(JBR_API_GENSRC_FILES), \
|
||||
DEPENDS := $(JBR_API_GENSRC_FILES), \
|
||||
BIN := $(JBR_API_BIN_DIR), \
|
||||
JAR := $(JBR_API_OUTPUT_DIR)/jbr-api.jar, \
|
||||
))
|
||||
|
||||
$(eval $(call SetupJarArchive, BUILD_JBR_API_SOURCES_JAR, \
|
||||
DEPENDENCIES := $(JBR_API_GENSRC_FILES) $(JBR_API_SRC_FILES), \
|
||||
SRCS := $(JBR_API_GENSRC_DIR) $(JBR_API_SRC_DIR), \
|
||||
JAR := $(JBR_API_OUTPUT_DIR)/jbr-api-sources.jar, \
|
||||
SUFFIXES := .java, \
|
||||
BIN := $(JBR_API_BIN_DIR), \
|
||||
))
|
||||
|
||||
$(JBR_API_GENSRC_FILES): $(JBR_API_GENSRC_SOURCES) $(JBR_API_SRC_FILES) $(JBR_API_VERSION_PROPERTIES)
|
||||
$(ECHO) Generating sources for JBR API
|
||||
$(JAVA_CMD) $(JAVA_FLAGS_SMALL) "$(JBR_API_GENSRC_TEMPLATES)/Gensrc.java" \
|
||||
"$(TOPDIR)/src" "$(JBR_API_OUTPUT_DIR)" "$(JBR_API_JBR_VERSION)"
|
||||
|
||||
jbr-api-check-version: $(JBR_API_GENSRC_FILES) $(JBR_API_SRC_FILES) $(JBR_API_VERSION_PROPERTIES)
|
||||
$(JAVA_CMD) $(JAVA_FLAGS_SMALL) "$(JBR_API_GENSRC_TEMPLATES)/CheckVersion.java" \
|
||||
"$(JBR_API_ROOT_DIR)" "$(JBR_API_GENSRC_DIR)" "$(JBR_API_FAIL_ON_HASH_MISMATCH)"
|
||||
|
||||
jbr-api: $(BUILD_JBR_API) $(BUILD_JBR_API_SOURCES_JAR) jbr-api-check-version
|
||||
|
||||
.PHONY: jbr-api jbr-api-check-version
|
||||
|
||||
ifneq ($(JBR_API_CONF_FILE),)
|
||||
$(JBR_API_CONF_FILE): $(JBR_API_GENSRC_FILES)
|
||||
$(ECHO) "VERSION=`$(CAT) $(JBR_API_OUTPUT_DIR)/jbr-api.version`" > $(JBR_API_CONF_FILE)
|
||||
$(ECHO) "JAR=$(JBR_API_OUTPUT_DIR)/jbr-api.jar" >> $(JBR_API_CONF_FILE)
|
||||
$(ECHO) "SOURCES_JAR=$(JBR_API_OUTPUT_DIR)/jbr-api-sources.jar" >> $(JBR_API_CONF_FILE)
|
||||
jbr-api: $(JBR_API_CONF_FILE)
|
||||
.PHONY: $(JBR_API_CONF_FILE)
|
||||
endif
|
||||
@@ -1254,13 +1254,6 @@ ALL_TARGETS += clean clean-docs clean-compile-commands dist-clean $(CLEAN_DIR_TA
|
||||
$(CLEAN_SUPPORT_DIR_TARGETS) $(CLEAN_TEST_TARGETS) $(CLEAN_PHASE_TARGETS) \
|
||||
$(CLEAN_MODULE_TARGETS) $(CLEAN_MODULE_PHASE_TARGETS)
|
||||
|
||||
################################################################################
|
||||
# JBR API
|
||||
|
||||
jbr-api:
|
||||
+($(CD) $(TOPDIR)/make && $(MAKE) $(MAKE_ARGS) -f JBRApi.gmk jbr-api)
|
||||
ALL_TARGETS += jbr-api
|
||||
|
||||
################################################################################
|
||||
# Declare *-only targets for each normal target
|
||||
$(foreach t, $(ALL_TARGETS), $(eval $(t)-only: $(t)))
|
||||
|
||||
@@ -532,7 +532,6 @@ define SetupRunGtestTestBody
|
||||
$$(FIXPATH) $$(TEST_IMAGE_DIR)/hotspot/gtest/$$($1_VARIANT)/gtestLauncher \
|
||||
-jdk $(JDK_IMAGE_DIR) $$($1_GTEST_FILTER) \
|
||||
--gtest_output=xml:$$($1_TEST_RESULTS_DIR)/gtest.xml \
|
||||
--gtest_catch_exceptions=0 \
|
||||
$$($1_GTEST_REPEAT) $$(GTEST_OPTIONS) $$(GTEST_VM_OPTIONS) \
|
||||
$$(GTEST_JAVA_OPTIONS) $$($1_AOT_OPTIONS) \
|
||||
> >($(TEE) $$($1_TEST_RESULTS_DIR)/gtest.txt) \
|
||||
|
||||
@@ -404,7 +404,7 @@ AC_DEFUN_ONCE([BASIC_COMPILE_FIXPATH],
|
||||
# simple cross compilation solution for fixpath for aarch64
|
||||
# Final solution should be backport of 8257679
|
||||
if test "x$COMPILE_TYPE-$OPENJDK_TARGET_CPU" = xcross-aarch64; then
|
||||
FIXPATH_CC=`$ECHO "$CC"|$SED 's|/arm64/cl|/x64/cl|I'`
|
||||
FIXPATH_CC=`$ECHO "$CC"|$SED 's|/arm64/cl|/x64/cl|'`
|
||||
FIXPATH_LIB=`$ECHO "$LIB"|$SED 's|arm64|x64|gI'`
|
||||
else
|
||||
FIXPATH_CC=$CC
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2019, 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
|
||||
@@ -107,17 +107,6 @@ AC_DEFUN([FLAGS_SETUP_ASFLAGS],
|
||||
[
|
||||
if test "x$OPENJDK_TARGET_OS" = xmacosx; then
|
||||
JVM_BASIC_ASFLAGS="-x assembler-with-cpp -mno-omit-leaf-frame-pointer -mstack-alignment=16"
|
||||
|
||||
# Fix linker warning.
|
||||
# Code taken from make/autoconf/flags-cflags.m4 and adapted.
|
||||
JVM_BASIC_ASFLAGS="$JVM_BASIC_ASFLAGS \
|
||||
-DMAC_OS_X_VERSION_MIN_REQUIRED=$MACOSX_VERSION_MIN_NODOTS \
|
||||
-mmacosx-version-min=$MACOSX_VERSION_MIN"
|
||||
|
||||
if test -n "$MACOSX_VERSION_MAX"; then
|
||||
JVM_BASIC_ASFLAGS="$JVM_BASIC_ASFLAGS $OS_CFLAGS \
|
||||
-DMAC_OS_X_VERSION_MAX_ALLOWED=$MACOSX_VERSION_MAX_NODOTS"
|
||||
fi
|
||||
fi
|
||||
])
|
||||
|
||||
|
||||
@@ -426,8 +426,7 @@ AC_DEFUN_ONCE([HOTSPOT_SETUP_JVM_FEATURES],
|
||||
if test "x$OPENJDK_TARGET_CPU" = "xx86_64" || \
|
||||
test "x$OPENJDK_TARGET_CPU" = "xsparcv9" || \
|
||||
test "x$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" = "xwindows-aarch64" || \
|
||||
test "x$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" = "xlinux-aarch64" || \
|
||||
test "x$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" = "xmacosx-aarch64" ; then
|
||||
test "x$OPENJDK_TARGET_OS-$OPENJDK_TARGET_CPU" = "xlinux-aarch64" ; then
|
||||
AC_MSG_RESULT([yes])
|
||||
JVM_FEATURES_jvmci="jvmci"
|
||||
INCLUDE_JVMCI="true"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2020, 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
|
||||
@@ -291,7 +291,11 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_DEBUG_SYMBOLS],
|
||||
[AS_HELP_STRING([--with-native-debug-symbols],
|
||||
[set the native debug symbol configuration (none, internal, external, zipped) @<:@varying@:>@])],
|
||||
[
|
||||
if test "x$OPENJDK_TARGET_OS" = xwindows; then
|
||||
if test "x$OPENJDK_TARGET_OS" = xaix; then
|
||||
if test "x$withval" = xexternal || test "x$withval" = xzipped; then
|
||||
AC_MSG_ERROR([AIX only supports the parameters 'none' and 'internal' for --with-native-debug-symbols])
|
||||
fi
|
||||
elif test "x$OPENJDK_TARGET_OS" = xwindows; then
|
||||
if test "x$withval" = xinternal; then
|
||||
AC_MSG_ERROR([Windows does not support the parameter 'internal' for --with-native-debug-symbols])
|
||||
fi
|
||||
@@ -301,7 +305,12 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_DEBUG_SYMBOLS],
|
||||
if test "x$STATIC_BUILD" = xtrue; then
|
||||
with_native_debug_symbols="none"
|
||||
else
|
||||
with_native_debug_symbols="external"
|
||||
if test "x$OPENJDK_TARGET_OS" = xaix; then
|
||||
# AIX doesn't support 'external' so use 'internal' as default
|
||||
with_native_debug_symbols="internal"
|
||||
else
|
||||
with_native_debug_symbols="external"
|
||||
fi
|
||||
fi
|
||||
])
|
||||
AC_MSG_RESULT([$with_native_debug_symbols])
|
||||
|
||||
@@ -382,7 +382,7 @@ GCOV_ENABLED=@GCOV_ENABLED@
|
||||
export ASAN_ENABLED:=@ASAN_ENABLED@
|
||||
export DEVKIT_LIB_DIR:=@DEVKIT_LIB_DIR@
|
||||
ifeq ($(ASAN_ENABLED), yes)
|
||||
export ASAN_OPTIONS=handle_segv=0 detect_leaks=0
|
||||
export ASAN_OPTIONS="handle_segv=0 detect_leaks=0"
|
||||
ifneq ($(DEVKIT_LIB_DIR),)
|
||||
export LD_LIBRARY_PATH:=$(LD_LIBRARY_PATH):$(DEVKIT_LIB_DIR)
|
||||
endif
|
||||
|
||||
@@ -961,12 +961,12 @@ AC_DEFUN_ONCE([TOOLCHAIN_SETUP_BUILD_COMPILERS],
|
||||
if test "x$OPENJDK_TARGET_CPU" = "xaarch64"; then
|
||||
# try to guess compiler layout. Final solution should be
|
||||
# backport of 8257679. Try primitive approach for now
|
||||
BUILD_CC=`$ECHO "$CC"|$SED 's|/arm64/cl|/x64/cl|I'`
|
||||
BUILD_CXX=`$ECHO "$CXX"|$SED 's|/arm64/cl|/x64/cl|I'`
|
||||
BUILD_AR=`$ECHO "$AR"|$SED 's|/arm64/lib|/x64/lib|I'`
|
||||
BUILD_LD=`$ECHO "$LD"|$SED 's|/arm64/link|/x64/link|I'`
|
||||
BUILD_SYSROOT_CFLAGS=`$ECHO "$SYSROOT_CFLAGS"|$SED 's|/arm64|/x64|gI'`
|
||||
BUILD_SYSROOT_LDFLAGS=`$ECHO "$SYSROOT_LDFLAGS"|$SED 's|/arm64|/x64|gI'`
|
||||
BUILD_CC=`$ECHO "$CC"|$SED 's|/arm64/cl|/x64/cl|'`
|
||||
BUILD_CXX=`$ECHO "$CXX"|$SED 's|/arm64/cl|/x64/cl|'`
|
||||
BUILD_AR=`$ECHO "$AR"|$SED 's|/arm64/lib|/x64/lib|'`
|
||||
BUILD_LD=`$ECHO "$LD"|$SED 's|/arm64/link|/x64/link|'`
|
||||
BUILD_SYSROOT_CFLAGS=`$ECHO "$SYSROOT_CFLAGS"|$SED 's|/arm64|/x64|g'`
|
||||
BUILD_SYSROOT_LDFLAGS=`$ECHO "$SYSROOT_LDFLAGS"|$SED 's|/arm64|/x64|g'`
|
||||
else
|
||||
AC_MSG_ERROR([only windows-aarch64 cross compilation is supported so far])
|
||||
fi
|
||||
|
||||
@@ -28,12 +28,12 @@
|
||||
|
||||
DEFAULT_VERSION_FEATURE=11
|
||||
DEFAULT_VERSION_INTERIM=0
|
||||
DEFAULT_VERSION_UPDATE=12
|
||||
DEFAULT_VERSION_UPDATE=11
|
||||
DEFAULT_VERSION_PATCH=0
|
||||
DEFAULT_VERSION_EXTRA1=0
|
||||
DEFAULT_VERSION_EXTRA2=0
|
||||
DEFAULT_VERSION_EXTRA3=0
|
||||
DEFAULT_VERSION_DATE=2021-07-20
|
||||
DEFAULT_VERSION_DATE=2021-04-20
|
||||
DEFAULT_VERSION_CLASSFILE_MAJOR=55 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="10 11"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2020, 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
|
||||
@@ -1008,13 +1008,6 @@ define SetupNativeCompilationBody
|
||||
$(CD) $$($1_OUTPUT_DIR) && \
|
||||
$$($1_OBJCOPY) --add-gnu-debuglink=$$($1_DEBUGINFO_FILES) $$($1_TARGET)
|
||||
|
||||
else ifeq ($(OPENJDK_TARGET_OS), aix)
|
||||
# AIX does not provide the equivalent of OBJCOPY to extract debug symbols,
|
||||
# so we copy the compiled object with symbols to the .debuginfo file, which
|
||||
# happens prior to the STRIP_CMD on the original target object file.
|
||||
$1_DEBUGINFO_FILES := $$($1_OUTPUT_DIR)/$$($1_NOSUFFIX).debuginfo
|
||||
$1_CREATE_DEBUGINFO_CMDS := $(CP) $$($1_TARGET) $$($1_DEBUGINFO_FILES)
|
||||
|
||||
else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
$1_DEBUGINFO_FILES := \
|
||||
$$($1_OUTPUT_DIR)/$$($1_BASENAME).dSYM/Contents/Info.plist \
|
||||
|
||||
@@ -75,7 +75,7 @@ define SetupTestFilesCompilationBody
|
||||
|
||||
# Locate all files with the matching prefix
|
||||
$1_FILE_LIST := \
|
||||
$$(call FindFiles, $$($1_SOURCE_DIRS), $$($1_PREFIX)*.c $$($1_PREFIX)*.m)
|
||||
$$(call FindFiles, $$($1_SOURCE_DIRS), $$($1_PREFIX)*.c)
|
||||
|
||||
$1_EXCLUDE_PATTERN := $$(addprefix %/, $$($1_EXCLUDE))
|
||||
$1_FILTERED_FILE_LIST := $$(filter-out $$($1_EXCLUDE_PATTERN), $$($1_FILE_LIST))
|
||||
|
||||
@@ -1160,15 +1160,15 @@ var concatObjects = function (o1, o2) {
|
||||
* @param patch Override patch version
|
||||
* @returns {String} The numeric version string
|
||||
*/
|
||||
var getVersion = function (feature, interim, update, patch, extra1, extra2, extra3) {
|
||||
var getVersion = function (feature, interim, update, patch) {
|
||||
var version_numbers = getVersionNumbers();
|
||||
var version = (feature != null ? feature : version_numbers.get("DEFAULT_VERSION_FEATURE"))
|
||||
+ "." + (interim != null ? interim : version_numbers.get("DEFAULT_VERSION_INTERIM"))
|
||||
+ "." + (update != null ? update : version_numbers.get("DEFAULT_VERSION_UPDATE"))
|
||||
+ "." + (patch != null ? patch : version_numbers.get("DEFAULT_VERSION_PATCH"))
|
||||
+ "." + (extra1 != null ? extra1 : version_numbers.get("DEFAULT_VERSION_EXTRA1"))
|
||||
+ "." + (extra2 != null ? extra2 : version_numbers.get("DEFAULT_VERSION_EXTRA2"))
|
||||
+ "." + (extra3 != null ? extra3 : version_numbers.get("DEFAULT_VERSION_EXTRA3"));
|
||||
+ "." + version_numbers.get("DEFAULT_VERSION_EXTRA1")
|
||||
+ "." + version_numbers.get("DEFAULT_VERSION_EXTRA2")
|
||||
+ "." + version_numbers.get("DEFAULT_VERSION_EXTRA3");
|
||||
while (version.match(".*\\.0$")) {
|
||||
version = version.substring(0, version.length - 2);
|
||||
}
|
||||
|
||||
@@ -42,6 +42,8 @@ ifneq ($(findstring $(OPENJDK_TARGET_OS), windows aix),)
|
||||
|
||||
endif
|
||||
|
||||
################################################################################
|
||||
# Copy the microsoft runtime libraries on windows
|
||||
################################################################################
|
||||
# Copy the microsoft runtime libraries on windows, but only if we are not
|
||||
# creating a buildjdk. If we are, the provided runtime librareis are made for
|
||||
|
||||
@@ -86,7 +86,7 @@ TARGETS += $(COPY_LEGAL)
|
||||
################################################################################
|
||||
|
||||
FONTFILE_SRC_DIR := $(TOPDIR)/src/java.desktop/share
|
||||
FONTFILE_SRCS := $(wildcard $(FONTFILE_SRC_DIR)/fonts/*.ttf) $(wildcard $(FONTFILE_SRC_DIR)/fonts/*.otf) $(FONTFILE_SRC_DIR)/fonts/fonts.dir $(FONTFILE_SRC_DIR)/fonts/font.conf
|
||||
FONTFILE_SRCS := $(wildcard $(FONTFILE_SRC_DIR)/fonts/*.ttf) $(FONTFILE_SRC_DIR)/fonts/fonts.dir $(FONTFILE_SRC_DIR)/fonts/font.conf
|
||||
FONTFILE_TARGET_FILES := $(subst $(FONTFILE_SRC_DIR),$(LIB_DST_DIR),$(FONTFILE_SRCS))
|
||||
|
||||
$(LIB_DST_DIR)/fonts/%: $(FONTFILE_SRC_DIR)/fonts/%
|
||||
|
||||
26
make/data/cacerts/soneraclass2ca
Normal file
26
make/data/cacerts/soneraclass2ca
Normal file
@@ -0,0 +1,26 @@
|
||||
Owner: CN=Sonera Class2 CA, O=Sonera, C=FI
|
||||
Issuer: CN=Sonera Class2 CA, O=Sonera, C=FI
|
||||
Serial number: 1d
|
||||
Valid from: Fri Apr 06 07:29:40 GMT 2001 until: Tue Apr 06 07:29:40 GMT 2021
|
||||
Signature algorithm name: SHA1withRSA
|
||||
Subject Public Key Algorithm: 2048-bit RSA key
|
||||
Version: 3
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDIDCCAgigAwIBAgIBHTANBgkqhkiG9w0BAQUFADA5MQswCQYDVQQGEwJGSTEP
|
||||
MA0GA1UEChMGU29uZXJhMRkwFwYDVQQDExBTb25lcmEgQ2xhc3MyIENBMB4XDTAx
|
||||
MDQwNjA3Mjk0MFoXDTIxMDQwNjA3Mjk0MFowOTELMAkGA1UEBhMCRkkxDzANBgNV
|
||||
BAoTBlNvbmVyYTEZMBcGA1UEAxMQU29uZXJhIENsYXNzMiBDQTCCASIwDQYJKoZI
|
||||
hvcNAQEBBQADggEPADCCAQoCggEBAJAXSjWdyvANlsdE+hY3/Ei9vX+ALTU74W+o
|
||||
Z6m/AxxNjG8yR9VBaKQTBME1DJqEQ/xcHf+Js+gXGM2RX/uJ4+q/Tl18GybTdXnt
|
||||
5oTjV+WtKcT0OijnpXuENmmz/V52vaMtmdOQTiMofRhj8VQ7Jp12W5dCsv+u8E7s
|
||||
3TmVToMGf+dJQMjFAbJUWmYdPfz56TwKnoG4cPABi+QjVHzIrviQHgCWctRUz2Ej
|
||||
vOr7nQKV0ba5cTppCD8PtOFCx4j1P5iop7oc4HFx71hXgVB6XGt0Rg6DA5jDjqhu
|
||||
8nYybieDwnPz3BjotJPqdURrBGAgcVeHnfO+oJAjPYok4doh28MCAwEAAaMzMDEw
|
||||
DwYDVR0TAQH/BAUwAwEB/zARBgNVHQ4ECgQISqCqWITTXjwwCwYDVR0PBAQDAgEG
|
||||
MA0GCSqGSIb3DQEBBQUAA4IBAQBazof5FnIVV0sd2ZvnoiYw7JNn39Yt0jSv9zil
|
||||
zqsWuasvfDXLrNAPtEwr/IDva4yRXzZ299uzGxnq9LIR/WFxRL8oszodv7ND6J+/
|
||||
3DEIcbCdjdY0RzKQxmUk96BKfARzjzlvF4xytb1LyHr4e4PDKE6cCepnP7JnBBvD
|
||||
FNr450kkkdAdavphOe9r5yF1BgfYErQhIHBCcYHaPJo2vqZbDWpsmh+Re/n570K6
|
||||
Tk6ezAyNlNzZRZxe7EJQY670XcSxEtzKO6gunRRaBXW37Ndj4ro1tgQIkejanZz2
|
||||
ZrUYrAqmVCY0M9IbwdR/GjqOC6oybtv8TyWf2TLHllpwrN9M
|
||||
-----END CERTIFICATE-----
|
||||
27
make/data/cacerts/thawtepremiumserverca
Normal file
27
make/data/cacerts/thawtepremiumserverca
Normal file
@@ -0,0 +1,27 @@
|
||||
Owner: EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
|
||||
Issuer: EMAILADDRESS=premium-server@thawte.com, CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
|
||||
Serial number: 36122296c5e338a520a1d25f4cd70954
|
||||
Valid from: Thu Aug 01 00:00:00 GMT 1996 until: Fri Jan 01 23:59:59 GMT 2021
|
||||
Signature algorithm name: SHA1withRSA
|
||||
Subject Public Key Algorithm: 1024-bit RSA key
|
||||
Version: 3
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDNjCCAp+gAwIBAgIQNhIilsXjOKUgodJfTNcJVDANBgkqhkiG9w0BAQUFADCB
|
||||
zjELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTESMBAGA1UEBxMJ
|
||||
Q2FwZSBUb3duMR0wGwYDVQQKExRUaGF3dGUgQ29uc3VsdGluZyBjYzEoMCYGA1UE
|
||||
CxMfQ2VydGlmaWNhdGlvbiBTZXJ2aWNlcyBEaXZpc2lvbjEhMB8GA1UEAxMYVGhh
|
||||
d3RlIFByZW1pdW0gU2VydmVyIENBMSgwJgYJKoZIhvcNAQkBFhlwcmVtaXVtLXNl
|
||||
cnZlckB0aGF3dGUuY29tMB4XDTk2MDgwMTAwMDAwMFoXDTIxMDEwMTIzNTk1OVow
|
||||
gc4xCzAJBgNVBAYTAlpBMRUwEwYDVQQIEwxXZXN0ZXJuIENhcGUxEjAQBgNVBAcT
|
||||
CUNhcGUgVG93bjEdMBsGA1UEChMUVGhhd3RlIENvbnN1bHRpbmcgY2MxKDAmBgNV
|
||||
BAsTH0NlcnRpZmljYXRpb24gU2VydmljZXMgRGl2aXNpb24xITAfBgNVBAMTGFRo
|
||||
YXd0ZSBQcmVtaXVtIFNlcnZlciBDQTEoMCYGCSqGSIb3DQEJARYZcHJlbWl1bS1z
|
||||
ZXJ2ZXJAdGhhd3RlLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0jY2
|
||||
aovXwlue2oFBYo847kkEVdbQ7xwblRZH7xhINTpS9CtqBo87L+pW46+GjZ4X9560
|
||||
ZXUCTe/LCaIhUdib0GfQug2SBhRz1JPLlyoAnFxODLz6FVL88kRu2hFKbgifLy3j
|
||||
+ao6hnO2RlNYyIkFvYMRuHM/qgeN9EJN50CdHDcCAwEAAaMTMBEwDwYDVR0TAQH/
|
||||
BAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQBlkKyID1bZ5jA01CbH0FDxkt5r1DmI
|
||||
CSLGpmODA/eZd9iy5Ri4XWPz1HP7bJyZePFLeH0ZJMMrAoT4vCLZiiLXoPxx7JGH
|
||||
IPG47LHlVYCsPVLIOQ7C8MAFT9aCdYy9X9LcdpoFEsmvcsPcJX6kTY4XpeCHf+Ga
|
||||
WuFg3GQjPEIuTQ==
|
||||
-----END CERTIFICATE-----
|
||||
26
make/data/cacerts/verisignclass2g2ca
Normal file
26
make/data/cacerts/verisignclass2g2ca
Normal file
@@ -0,0 +1,26 @@
|
||||
Owner: OU=VeriSign Trust Network, OU="(c) 1998 VeriSign, Inc. - For authorized use only", OU=Class 2 Public Primary Certification Authority - G2, O="VeriSign, Inc.", C=US
|
||||
Issuer: OU=VeriSign Trust Network, OU="(c) 1998 VeriSign, Inc. - For authorized use only", OU=Class 2 Public Primary Certification Authority - G2, O="VeriSign, Inc.", C=US
|
||||
Serial number: b92f60cc889fa17a4609b85b706c8aaf
|
||||
Valid from: Mon May 18 00:00:00 GMT 1998 until: Tue Aug 01 23:59:59 GMT 2028
|
||||
Signature algorithm name: SHA1withRSA
|
||||
Subject Public Key Algorithm: 1024-bit RSA key
|
||||
Version: 1
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDAzCCAmwCEQC5L2DMiJ+hekYJuFtwbIqvMA0GCSqGSIb3DQEBBQUAMIHBMQsw
|
||||
CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0Ns
|
||||
YXNzIDIgUHVibGljIFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBH
|
||||
MjE6MDgGA1UECxMxKGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9y
|
||||
aXplZCB1c2Ugb25seTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazAe
|
||||
Fw05ODA1MTgwMDAwMDBaFw0yODA4MDEyMzU5NTlaMIHBMQswCQYDVQQGEwJVUzEX
|
||||
MBUGA1UEChMOVmVyaVNpZ24sIEluYy4xPDA6BgNVBAsTM0NsYXNzIDIgUHVibGlj
|
||||
IFByaW1hcnkgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMjE6MDgGA1UECxMx
|
||||
KGMpIDE5OTggVmVyaVNpZ24sIEluYy4gLSBGb3IgYXV0aG9yaXplZCB1c2Ugb25s
|
||||
eTEfMB0GA1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazCBnzANBgkqhkiG9w0B
|
||||
AQEFAAOBjQAwgYkCgYEAp4gBIXQs5xoD8JjhlzwPIQjxnNuX6Zr8wgQGE75fUsjM
|
||||
HiwSViy4AWkszJkfrbCWrnkE8hM5wXuYuggs6MKEEyyqaekJ9MepAqRCwiNPStjw
|
||||
DqL7MWzJ5m+ZJwf15vRMeJ5t60aG+rmGyVTyssSv1EYcWskVMP8NbPUtDm3Of3cC
|
||||
AwEAATANBgkqhkiG9w0BAQUFAAOBgQByLvl/0fFx+8Se9sVeUYpAmLho+Jscg9ji
|
||||
nb3/7aHmZuovCfTK1+qlK5X2JGCGTUQug6XELaDTrnhpb3LabK4I8GOSN+a7xDAX
|
||||
rXfMSTWqz9iP0b63GJZHc2pUIjRkLbYWm1lbtFFZOrMLFPQS32eg9K0yZF6xRnIn
|
||||
jBJ7xUS0rg==
|
||||
-----END CERTIFICATE-----
|
||||
21
make/data/cacerts/verisignclass3ca
Normal file
21
make/data/cacerts/verisignclass3ca
Normal file
@@ -0,0 +1,21 @@
|
||||
Owner: OU=Class 3 Public Primary Certification Authority, O="VeriSign, Inc.", C=US
|
||||
Issuer: OU=Class 3 Public Primary Certification Authority, O="VeriSign, Inc.", C=US
|
||||
Serial number: 3c9131cb1ff6d01b0e9ab8d044bf12be
|
||||
Valid from: Mon Jan 29 00:00:00 GMT 1996 until: Wed Aug 02 23:59:59 GMT 2028
|
||||
Signature algorithm name: SHA1withRSA
|
||||
Subject Public Key Algorithm: 1024-bit RSA key
|
||||
Version: 1
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICPDCCAaUCEDyRMcsf9tAbDpq40ES/Er4wDQYJKoZIhvcNAQEFBQAwXzELMAkG
|
||||
A1UEBhMCVVMxFzAVBgNVBAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFz
|
||||
cyAzIFB1YmxpYyBQcmltYXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTk2
|
||||
MDEyOTAwMDAwMFoXDTI4MDgwMjIzNTk1OVowXzELMAkGA1UEBhMCVVMxFzAVBgNV
|
||||
BAoTDlZlcmlTaWduLCBJbmMuMTcwNQYDVQQLEy5DbGFzcyAzIFB1YmxpYyBQcmlt
|
||||
YXJ5IENlcnRpZmljYXRpb24gQXV0aG9yaXR5MIGfMA0GCSqGSIb3DQEBAQUAA4GN
|
||||
ADCBiQKBgQDJXFme8huKARS0EN8EQNvjV69qRUCPhAwL0TPZ2RHP7gJYHyX3KqhE
|
||||
BarsAx94f56TuZoAqiN91qyFomNFx3InzPRMxnVx0jnvT0Lwdd8KkMaOIG+YD/is
|
||||
I19wKTakyYbnsZogy1Olhec9vn2a/iRFM9x2Fe0PonFkTGUugWhFpwIDAQABMA0G
|
||||
CSqGSIb3DQEBBQUAA4GBABByUqkFFBkyCEHwxWsKzH4PIRnN5GfcX6kb5sroc50i
|
||||
2JhucwNhkcV8sEVAbkSdjbCxlnRhLQ2pRdKkkirWmnWXbj9T/UWZYB2oK0z5XqcJ
|
||||
2HUw19JlYD1n1khVdWk/kfVIC0dpImmClr7JyDiGSnoscxlIaU5rfGW/D/xwzoiQ
|
||||
-----END CERTIFICATE-----
|
||||
26
make/data/cacerts/verisignclass3g2ca
Normal file
26
make/data/cacerts/verisignclass3g2ca
Normal file
@@ -0,0 +1,26 @@
|
||||
Owner: OU=VeriSign Trust Network, OU="(c) 1998 VeriSign, Inc. - For authorized use only", OU=Class 3 Public Primary Certification Authority - G2, O="VeriSign, Inc.", C=US
|
||||
Issuer: OU=VeriSign Trust Network, OU="(c) 1998 VeriSign, Inc. - For authorized use only", OU=Class 3 Public Primary Certification Authority - G2, O="VeriSign, Inc.", C=US
|
||||
Serial number: 7dd9fe07cfa81eb7107967fba78934c6
|
||||
Valid from: Mon May 18 00:00:00 GMT 1998 until: Tue Aug 01 23:59:59 GMT 2028
|
||||
Signature algorithm name: SHA1withRSA
|
||||
Subject Public Key Algorithm: 1024-bit RSA key
|
||||
Version: 1
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIIDAjCCAmsCEH3Z/gfPqB63EHln+6eJNMYwDQYJKoZIhvcNAQEFBQAwgcExCzAJ
|
||||
BgNVBAYTAlVTMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xh
|
||||
c3MgMyBQdWJsaWMgUHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcy
|
||||
MTowOAYDVQQLEzEoYykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3Jp
|
||||
emVkIHVzZSBvbmx5MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMB4X
|
||||
DTk4MDUxODAwMDAwMFoXDTI4MDgwMTIzNTk1OVowgcExCzAJBgNVBAYTAlVTMRcw
|
||||
FQYDVQQKEw5WZXJpU2lnbiwgSW5jLjE8MDoGA1UECxMzQ2xhc3MgMyBQdWJsaWMg
|
||||
UHJpbWFyeSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eSAtIEcyMTowOAYDVQQLEzEo
|
||||
YykgMTk5OCBWZXJpU2lnbiwgSW5jLiAtIEZvciBhdXRob3JpemVkIHVzZSBvbmx5
|
||||
MR8wHQYDVQQLExZWZXJpU2lnbiBUcnVzdCBOZXR3b3JrMIGfMA0GCSqGSIb3DQEB
|
||||
AQUAA4GNADCBiQKBgQDMXtERXVxp0KvTuWpMmR9ZmDCOFoUgRm1HP9SFIIThbbP4
|
||||
pO0M8RcPO/mn+SXXwc+EY/J8Y8+iR/LGWzOOZEAEaMGAuWQcRXfH2G71lSk8UOg0
|
||||
13gfqLptQ5GVj0VXXn7F+8qkBOvqlzdUMG+7AUcyM83cV5tkaWH4mx0ciU9cZwID
|
||||
AQABMA0GCSqGSIb3DQEBBQUAA4GBAFFNzb5cy5gZnBWyATl4Lk0PZ3BwmcYQWpSk
|
||||
U01UbSuvDV1Ai2TT1+7eVmGSX6bEHRBhNtMsJzzoKQm5EWR0zLVznxxIqbxhAe7i
|
||||
F6YM40AIOw7n60RzKprxaZLvcRTDOaxxp5EJb+RxBrO6WVcmeQD2+A2iMzAo1KpY
|
||||
oJ2daZH9
|
||||
-----END CERTIFICATE-----
|
||||
24
make/data/cacerts/verisigntsaca
Normal file
24
make/data/cacerts/verisigntsaca
Normal file
@@ -0,0 +1,24 @@
|
||||
Owner: CN=Thawte Timestamping CA, OU=Thawte Certification, O=Thawte, L=Durbanville, ST=Western Cape, C=ZA
|
||||
Issuer: CN=Thawte Timestamping CA, OU=Thawte Certification, O=Thawte, L=Durbanville, ST=Western Cape, C=ZA
|
||||
Serial number: 67c8e1e8e3be1cbdfc913b8ea6238749
|
||||
Valid from: Wed Jan 01 00:00:00 GMT 1997 until: Fri Jan 01 23:59:59 GMT 2021
|
||||
Signature algorithm name: SHA1withRSA
|
||||
Subject Public Key Algorithm: 1024-bit RSA key
|
||||
Version: 3
|
||||
-----BEGIN CERTIFICATE-----
|
||||
MIICsDCCAhmgAwIBAgIQZ8jh6OO+HL38kTuOpiOHSTANBgkqhkiG9w0BAQUFADCB
|
||||
izELMAkGA1UEBhMCWkExFTATBgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxML
|
||||
RHVyYmFudmlsbGUxDzANBgNVBAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENl
|
||||
cnRpZmljYXRpb24xHzAdBgNVBAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwHhcN
|
||||
OTcwMTAxMDAwMDAwWhcNMjEwMTAxMjM1OTU5WjCBizELMAkGA1UEBhMCWkExFTAT
|
||||
BgNVBAgTDFdlc3Rlcm4gQ2FwZTEUMBIGA1UEBxMLRHVyYmFudmlsbGUxDzANBgNV
|
||||
BAoTBlRoYXd0ZTEdMBsGA1UECxMUVGhhd3RlIENlcnRpZmljYXRpb24xHzAdBgNV
|
||||
BAMTFlRoYXd0ZSBUaW1lc3RhbXBpbmcgQ0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0A
|
||||
MIGJAoGBANYrWHhhRYZT6jR7UZztsOYuGA7+4F+oJ9O0yeB8WU4WDnNUYMF/9p8u
|
||||
6TqFJBU820cEY8OexJQaWt9MevPZQx08EHp5JduQ/vBR5zDWQQD9nyjfeb6Uu522
|
||||
FOMjhdepQeBMpHmwKxqL8vg7ij5FrHGSALSQQZj7X+36ty6K+Ig3AgMBAAGjEzAR
|
||||
MA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAS+mqF4EF+3kKMZ/F
|
||||
QfRWVKvpwuWXjhj+kckMPiZkyaFMJ2SnvQGTVXFuF0853BvcSTUQOSP/ypvIz2Y/
|
||||
3Ewa1IEGQlIf4SaxFhe65nByMUToTo1b5NP50OOPJWQx5yr4GIg2GlLFDUE1G2m3
|
||||
JvUXzMEZXkt8XOKDgJH6L/uatxY=
|
||||
-----END CERTIFICATE-----
|
||||
@@ -1,4 +1,4 @@
|
||||
File-Date: 2020-09-29
|
||||
File-Date: 2019-09-16
|
||||
%%
|
||||
Type: language
|
||||
Subtag: aa
|
||||
@@ -1530,7 +1530,7 @@ Added: 2005-10-16
|
||||
%%
|
||||
Type: language
|
||||
Subtag: adb
|
||||
Description: Atauran
|
||||
Description: Adabe
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
@@ -2707,7 +2707,6 @@ Type: language
|
||||
Subtag: aoh
|
||||
Description: Arma
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: aoi
|
||||
@@ -3771,7 +3770,6 @@ Type: language
|
||||
Subtag: ayy
|
||||
Description: Tayabas Ayta
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ayz
|
||||
@@ -4087,7 +4085,6 @@ Type: language
|
||||
Subtag: bbz
|
||||
Description: Babalia Creole Arabic
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Macrolanguage: ar
|
||||
%%
|
||||
Type: language
|
||||
@@ -5758,7 +5755,6 @@ Type: language
|
||||
Subtag: bpb
|
||||
Description: Barbacoas
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: bpd
|
||||
@@ -6015,7 +6011,7 @@ Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: brf
|
||||
Description: Bira
|
||||
Description: Bera
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
@@ -7378,7 +7374,6 @@ Type: language
|
||||
Subtag: cca
|
||||
Description: Cauca
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ccc
|
||||
@@ -7485,7 +7480,6 @@ Type: language
|
||||
Subtag: cdg
|
||||
Description: Chamari
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: cdh
|
||||
@@ -7881,11 +7875,6 @@ Description: Cibak
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ckm
|
||||
Description: Chakavian
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ckn
|
||||
Description: Kaang Chin
|
||||
Added: 2013-09-10
|
||||
@@ -8132,13 +8121,6 @@ Description: Con
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: cnp
|
||||
Description: Northern Ping Chinese
|
||||
Description: Northern Pinghua
|
||||
Added: 2020-03-28
|
||||
Macrolanguage: zh
|
||||
%%
|
||||
Type: language
|
||||
Subtag: cnr
|
||||
Description: Montenegrin
|
||||
Added: 2018-01-23
|
||||
@@ -8582,13 +8564,6 @@ Description: Sochiapan Chinantec
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: csp
|
||||
Description: Southern Ping Chinese
|
||||
Description: Southern Pinghua
|
||||
Added: 2020-03-28
|
||||
Macrolanguage: zh
|
||||
%%
|
||||
Type: language
|
||||
Subtag: csq
|
||||
Description: Croatia Sign Language
|
||||
Added: 2009-07-29
|
||||
@@ -9343,7 +9318,6 @@ Macrolanguage: doi
|
||||
Type: language
|
||||
Subtag: dgr
|
||||
Description: Dogrib
|
||||
Description: Tłı̨chǫ
|
||||
Added: 2005-10-16
|
||||
%%
|
||||
Type: language
|
||||
@@ -9360,7 +9334,6 @@ Type: language
|
||||
Subtag: dgu
|
||||
Description: Degaru
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: dgw
|
||||
@@ -9747,11 +9720,6 @@ Description: Dugwor
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: dmf
|
||||
Description: Medefaidrin
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: dmg
|
||||
Description: Upper Kinabatangan
|
||||
Added: 2009-07-29
|
||||
@@ -10073,8 +10041,6 @@ Type: language
|
||||
Subtag: drr
|
||||
Description: Dororo
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Preferred-Value: kzk
|
||||
%%
|
||||
Type: language
|
||||
Subtag: drs
|
||||
@@ -10364,11 +10330,6 @@ Description: Diri
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: dwk
|
||||
Description: Dawik Kui
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: dwl
|
||||
Description: Walo Kumbe Dogon
|
||||
Added: 2009-07-29
|
||||
@@ -10494,11 +10455,6 @@ Description: Karenggapa
|
||||
Added: 2013-09-10
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ebc
|
||||
Description: Beginci
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ebg
|
||||
Description: Ebughu
|
||||
Added: 2009-07-29
|
||||
@@ -10620,7 +10576,6 @@ Type: language
|
||||
Subtag: ekc
|
||||
Description: Eastern Karnic
|
||||
Added: 2013-09-10
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: eke
|
||||
@@ -11260,11 +11215,6 @@ Description: Fyer
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: fif
|
||||
Description: Faifi
|
||||
Added: 2020-06-08
|
||||
%%
|
||||
Type: language
|
||||
Subtag: fil
|
||||
Description: Filipino
|
||||
Description: Pilipino
|
||||
@@ -11931,7 +11881,6 @@ Added: 2009-07-29
|
||||
Type: language
|
||||
Subtag: gdh
|
||||
Description: Gadjerawang
|
||||
Description: Gajirrabeng
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
@@ -12021,11 +11970,6 @@ Description: Gade
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: gef
|
||||
Description: Gerai
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: geg
|
||||
Description: Gengle
|
||||
Added: 2009-07-29
|
||||
@@ -12437,8 +12381,6 @@ Type: language
|
||||
Subtag: gli
|
||||
Description: Guliguli
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Preferred-Value: kzk
|
||||
%%
|
||||
Type: language
|
||||
Subtag: glj
|
||||
@@ -12534,12 +12476,6 @@ Added: 2009-07-29
|
||||
Scope: collection
|
||||
%%
|
||||
Type: language
|
||||
Subtag: gmr
|
||||
Description: Mirning
|
||||
Description: Mirniny
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: gmu
|
||||
Description: Gumalu
|
||||
Added: 2009-07-29
|
||||
@@ -13219,7 +13155,6 @@ Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: gwc
|
||||
Description: Gawri
|
||||
Description: Kalami
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
@@ -13924,11 +13859,6 @@ Description: Chhattisgarhi
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: hng
|
||||
Description: Hungu
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: hnh
|
||||
Description: ǁAni
|
||||
Added: 2009-07-29
|
||||
@@ -14210,7 +14140,6 @@ Added: 2009-07-29
|
||||
Type: language
|
||||
Subtag: huc
|
||||
Description: ǂHua
|
||||
Description: ǂʼAmkhoe
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
@@ -15981,7 +15910,6 @@ Added: 2009-07-29
|
||||
Type: language
|
||||
Subtag: kaa
|
||||
Description: Kara-Kalpak
|
||||
Description: Karakalpak
|
||||
Added: 2005-10-16
|
||||
%%
|
||||
Type: language
|
||||
@@ -17139,9 +17067,8 @@ Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: kjf
|
||||
Description: Khalaj [Indo-Iranian]
|
||||
Description: Khalaj
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: kjg
|
||||
@@ -17321,7 +17248,7 @@ Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: kkq
|
||||
Description: Kaeku
|
||||
Description: Kaiku
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
@@ -17417,7 +17344,7 @@ Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: klj
|
||||
Description: Khalaj
|
||||
Description: Turkic Khalaj
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
@@ -18570,7 +18497,6 @@ Added: 2009-07-29
|
||||
Type: language
|
||||
Subtag: kui
|
||||
Description: Kuikúro-Kalapálo
|
||||
Description: Kalapalo
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
@@ -18982,8 +18908,6 @@ Type: language
|
||||
Subtag: kxl
|
||||
Description: Nepali Kurux
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Preferred-Value: kru
|
||||
%%
|
||||
Type: language
|
||||
Subtag: kxm
|
||||
@@ -19029,8 +18953,6 @@ Type: language
|
||||
Subtag: kxu
|
||||
Description: Kui (India)
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Comments: see dwk, uki
|
||||
%%
|
||||
Type: language
|
||||
Subtag: kxv
|
||||
@@ -20415,7 +20337,6 @@ Type: language
|
||||
Subtag: lmz
|
||||
Description: Lumbee
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: lna
|
||||
@@ -22867,7 +22788,6 @@ Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: moe
|
||||
Description: Innu
|
||||
Description: Montagnais
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
@@ -26279,11 +26199,6 @@ Description: Sangtam Naga
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: nsb
|
||||
Description: Lower Nossob
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: nsc
|
||||
Description: Nshi
|
||||
Added: 2009-07-29
|
||||
@@ -26752,8 +26667,6 @@ Type: language
|
||||
Subtag: nxu
|
||||
Description: Narau
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Preferred-Value: bpp
|
||||
%%
|
||||
Type: language
|
||||
Subtag: nxx
|
||||
@@ -28253,7 +28166,7 @@ Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: pfe
|
||||
Description: Pere
|
||||
Description: Peere
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
@@ -28659,7 +28572,6 @@ Type: language
|
||||
Subtag: plp
|
||||
Description: Palpa
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: plq
|
||||
@@ -31220,8 +31132,6 @@ Type: language
|
||||
Subtag: sdm
|
||||
Description: Semandang
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Comments: see ebc, gef, sdq
|
||||
%%
|
||||
Type: language
|
||||
Subtag: sdn
|
||||
@@ -31240,11 +31150,6 @@ Description: Sherdukpen
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: sdq
|
||||
Description: Semandang
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: sdr
|
||||
Description: Oraon Sadri
|
||||
Added: 2009-07-29
|
||||
@@ -33597,7 +33502,6 @@ Type: language
|
||||
Subtag: tbb
|
||||
Description: Tapeba
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: tbc
|
||||
@@ -34315,8 +34219,6 @@ Type: language
|
||||
Subtag: thw
|
||||
Description: Thudam
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-06-08
|
||||
Preferred-Value: ola
|
||||
%%
|
||||
Type: language
|
||||
Subtag: thx
|
||||
@@ -36338,11 +36240,6 @@ Description: Ukhwejo
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: uki
|
||||
Description: Kui (India)
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ukk
|
||||
Description: Muak Sa-aak
|
||||
Added: 2017-02-23
|
||||
@@ -36374,11 +36271,6 @@ Description: Ukue
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ukv
|
||||
Description: Kuku
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ukw
|
||||
Description: Ukwuani-Aboh-Ndoni
|
||||
Added: 2009-07-29
|
||||
@@ -37868,11 +37760,6 @@ Description: Kunbarlang
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: wlh
|
||||
Description: Welaun
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: wli
|
||||
Description: Waioli
|
||||
Added: 2009-07-29
|
||||
@@ -39345,11 +39232,6 @@ Description: Nganakarti
|
||||
Added: 2013-09-10
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xnm
|
||||
Description: Ngumbarl
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xnn
|
||||
Description: Northern Kankanay
|
||||
Added: 2009-07-29
|
||||
@@ -39452,45 +39334,22 @@ Description: Pirriya
|
||||
Added: 2013-09-10
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpb
|
||||
Description: Northeastern Tasmanian
|
||||
Description: Pyemmairrener
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpc
|
||||
Description: Pecheneg
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpd
|
||||
Description: Oyster Bay Tasmanian
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpe
|
||||
Description: Liberia Kpelle
|
||||
Added: 2009-07-29
|
||||
Macrolanguage: kpe
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpf
|
||||
Description: Southeast Tasmanian
|
||||
Description: Nuenonne
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpg
|
||||
Description: Phrygian
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xph
|
||||
Description: North Midlands Tasmanian
|
||||
Description: Tyerrenoterpanner
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpi
|
||||
Description: Pictish
|
||||
Added: 2009-07-29
|
||||
@@ -39506,11 +39365,6 @@ Description: Kulina Pano
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpl
|
||||
Description: Port Sorell Tasmanian
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpm
|
||||
Description: Pumpokol
|
||||
Added: 2009-07-29
|
||||
@@ -39556,34 +39410,11 @@ Description: Punic
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpv
|
||||
Description: Northern Tasmanian
|
||||
Description: Tommeginne
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpw
|
||||
Description: Northwestern Tasmanian
|
||||
Description: Peerapper
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpx
|
||||
Description: Southwestern Tasmanian
|
||||
Description: Toogee
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpy
|
||||
Description: Puyo
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xpz
|
||||
Description: Bruny Island Tasmanian
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xqa
|
||||
Description: Karakhanid
|
||||
Added: 2009-07-29
|
||||
@@ -39637,8 +39468,6 @@ Type: language
|
||||
Subtag: xrq
|
||||
Description: Karranga
|
||||
Added: 2013-09-10
|
||||
Deprecated: 2020-03-28
|
||||
Preferred-Value: dmw
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xrr
|
||||
@@ -39871,8 +39700,6 @@ Type: language
|
||||
Subtag: xtz
|
||||
Description: Tasmanian
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Comments: see xpb, xpd, xpf, xph, xpl, xpv, xpw, xpx, xpz
|
||||
%%
|
||||
Type: language
|
||||
Subtag: xua
|
||||
@@ -39902,7 +39729,6 @@ Added: 2009-07-29
|
||||
Type: language
|
||||
Subtag: xul
|
||||
Description: Ngunawal
|
||||
Description: Nunukul
|
||||
Added: 2013-09-10
|
||||
%%
|
||||
Type: language
|
||||
@@ -41495,11 +41321,6 @@ Description: Zari
|
||||
Added: 2009-07-29
|
||||
%%
|
||||
Type: language
|
||||
Subtag: zba
|
||||
Description: Balaibalan
|
||||
Added: 2020-03-28
|
||||
%%
|
||||
Type: language
|
||||
Subtag: zbc
|
||||
Description: Central Berawan
|
||||
Added: 2009-07-29
|
||||
@@ -41665,8 +41486,6 @@ Type: language
|
||||
Subtag: zir
|
||||
Description: Ziriya
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Preferred-Value: scv
|
||||
%%
|
||||
Type: language
|
||||
Subtag: ziw
|
||||
@@ -42644,7 +42463,6 @@ Type: extlang
|
||||
Subtag: bbz
|
||||
Description: Babalia Creole Arabic
|
||||
Added: 2009-07-29
|
||||
Deprecated: 2020-03-28
|
||||
Preferred-Value: bbz
|
||||
Prefix: ar
|
||||
Macrolanguage: ar
|
||||
@@ -42762,15 +42580,6 @@ Prefix: zh
|
||||
Macrolanguage: zh
|
||||
%%
|
||||
Type: extlang
|
||||
Subtag: cnp
|
||||
Description: Northern Ping Chinese
|
||||
Description: Northern Pinghua
|
||||
Added: 2020-03-28
|
||||
Preferred-Value: cnp
|
||||
Prefix: zh
|
||||
Macrolanguage: zh
|
||||
%%
|
||||
Type: extlang
|
||||
Subtag: coa
|
||||
Description: Cocos Islands Malay
|
||||
Added: 2009-07-29
|
||||
@@ -42838,15 +42647,6 @@ Preferred-Value: csn
|
||||
Prefix: sgn
|
||||
%%
|
||||
Type: extlang
|
||||
Subtag: csp
|
||||
Description: Southern Ping Chinese
|
||||
Description: Southern Pinghua
|
||||
Added: 2020-03-28
|
||||
Preferred-Value: csp
|
||||
Prefix: zh
|
||||
Macrolanguage: zh
|
||||
%%
|
||||
Type: extlang
|
||||
Subtag: csq
|
||||
Description: Croatia Sign Language
|
||||
Added: 2009-07-29
|
||||
@@ -45128,11 +44928,6 @@ Description: Tirhuta
|
||||
Added: 2011-08-16
|
||||
%%
|
||||
Type: script
|
||||
Subtag: Toto
|
||||
Description: Toto
|
||||
Added: 2020-05-12
|
||||
%%
|
||||
Type: script
|
||||
Subtag: Ugar
|
||||
Description: Ugaritic
|
||||
Added: 2005-10-16
|
||||
@@ -46835,12 +46630,6 @@ Comments: Denotes conventions established by the Academia Brasileira de
|
||||
Letras in 1943 and generally used in Brazil until 2009
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: akuapem
|
||||
Description: Akuapem Twi
|
||||
Added: 2017-06-05
|
||||
Prefix: tw
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: alalc97
|
||||
Description: ALA-LC Romanization, 1997 edition
|
||||
Added: 2009-12-09
|
||||
@@ -46859,6 +46648,12 @@ Comments: Aluku dialect of the "Busi Nenge Tongo" English-based Creole
|
||||
continuum in Eastern Suriname and Western French Guiana
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: akuapem
|
||||
Description: Akuapem Twi
|
||||
Added: 2017-06-05
|
||||
Prefix: tw
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: ao1990
|
||||
Description: Portuguese Language Orthographic Agreement of 1990 (Acordo
|
||||
Ortográfico da Língua Portuguesa de 1990)
|
||||
@@ -47334,16 +47129,6 @@ Comments: Pamaka dialect of the "Busi Nenge Tongo" English-based
|
||||
Creole continuum in Eastern Suriname and Western French Guiana
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: peano
|
||||
Description: Latino Sine Flexione
|
||||
Description: Interlingua de API
|
||||
Description: Interlingua de Peano
|
||||
Prefix: la
|
||||
Comments: Peano’s Interlingua, created in 1903 by Giuseppe Peano as an
|
||||
international auxiliary language
|
||||
Added: 2020-03-12
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: petr1708
|
||||
Description: Petrine orthography
|
||||
Added: 2010-10-10
|
||||
@@ -47481,23 +47266,6 @@ Comments: The subtag represents Branislau Taraskievic's Belarusian
|
||||
Miensk 2005).
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: tongyong
|
||||
Description: Tongyong Pinyin romanization
|
||||
Added: 2020-06-08
|
||||
Prefix: zh-Latn
|
||||
Comments: Former official transcription standard for Mandarin Chinese in
|
||||
Taiwan.
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: tunumiit
|
||||
Description: Tunumiisiut
|
||||
Description: East Greenlandic
|
||||
Description: Østgrønlandsk
|
||||
Added: 2020-07-16
|
||||
Prefix: kl
|
||||
Comments: Also known as Tunumiit oraasiat
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: uccor
|
||||
Description: Unified Cornish orthography of Revived Cornish
|
||||
Added: 2008-10-14
|
||||
@@ -47550,14 +47318,6 @@ Comments: Vallader is one of the five traditional written standards or
|
||||
"idioms" of the Romansh language.
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: vecdruka
|
||||
Description: Latvian orthography used before 1920s ("vecā druka")
|
||||
Added: 2020-09-26
|
||||
Prefix: lv
|
||||
Comments: The subtag represents the old orthography of the Latvian
|
||||
language used during c. 1600s–1920s.
|
||||
%%
|
||||
Type: variant
|
||||
Subtag: vivaraup
|
||||
Description: Vivaro-Alpine
|
||||
Added: 2018-04-22
|
||||
|
||||
@@ -115,7 +115,7 @@ if [ ! -d $DEVKIT_ROOT/VC ]; then
|
||||
cp $DEVKIT_ROOT/VC/redist/x86/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/x86
|
||||
cp $DEVKIT_ROOT/VC/redist/x64/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/x64
|
||||
cp $DEVKIT_ROOT/VC/redist/x64/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/x64
|
||||
cp $DEVKIT_ROOT/VC/redist/arm64/$MSVCR_DLL $DEVKIT_ROOT/VC/bin/arm64
|
||||
cp $DEVKIT_ROOT/VC/redist/arm64/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/arm64
|
||||
cp $DEVKIT_ROOT/VC/redist/arm64/$MSVCP_DLL $DEVKIT_ROOT/VC/bin/arm64
|
||||
fi
|
||||
|
||||
|
||||
@@ -99,9 +99,6 @@ ifeq ($(call check-jvm-feature, compiler2), true)
|
||||
ADLCFLAGS += -DAIX=1
|
||||
else ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
ADLCFLAGS += -D_ALLBSD_SOURCE=1 -D_GNU_SOURCE=1
|
||||
ifeq ($(HOTSPOT_TARGET_CPU_ARCH), aarch64)
|
||||
ADLCFLAGS += -DR18_RESERVED=1
|
||||
endif
|
||||
else ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
ifeq ($(call isTargetCpuBits, 64), true)
|
||||
ADLCFLAGS += -D_WIN64=1
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2012, 2017, 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
|
||||
@@ -33,12 +33,10 @@ import java.nio.file.Paths;
|
||||
import java.time.ZoneId;
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.TreeMap;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* This tool reads the IANA Language Subtag Registry data file downloaded from
|
||||
@@ -77,49 +75,32 @@ public class EquivMapsGenerator {
|
||||
String type = null;
|
||||
String tag = null;
|
||||
String preferred = null;
|
||||
String prefix = null;
|
||||
|
||||
for (String line : Files.readAllLines(Paths.get(filename),
|
||||
Charset.forName("UTF-8"))) {
|
||||
line = line.toLowerCase(Locale.ROOT);
|
||||
int index = line.indexOf(' ') + 1;
|
||||
int index = line.indexOf(' ')+1;
|
||||
if (line.startsWith("file-date:")) {
|
||||
LSRrevisionDate = line.substring(index);
|
||||
} else if (line.startsWith("type:")) {
|
||||
type = line.substring(index);
|
||||
} else if (line.startsWith("tag:") || line.startsWith("subtag:")) {
|
||||
tag = line.substring(index);
|
||||
} else if (line.startsWith("preferred-value:")) {
|
||||
} else if (line.startsWith("preferred-value:")
|
||||
&& !type.equals("extlang")) {
|
||||
preferred = line.substring(index);
|
||||
} else if (line.startsWith("prefix:")) {
|
||||
prefix = line.substring(index);
|
||||
processDeprecatedData(type, tag, preferred);
|
||||
} else if (line.equals("%%")) {
|
||||
processDeprecatedData(type, tag, preferred, prefix);
|
||||
type = null;
|
||||
tag = null;
|
||||
preferred = null;
|
||||
prefix = null;
|
||||
}
|
||||
}
|
||||
|
||||
// Last entry
|
||||
processDeprecatedData(type, tag, preferred, prefix);
|
||||
}
|
||||
|
||||
private static void processDeprecatedData(String type,
|
||||
String tag,
|
||||
String preferred,
|
||||
String prefix) {
|
||||
String preferred) {
|
||||
StringBuilder sb;
|
||||
|
||||
if (type == null || tag == null || preferred == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (type.equals("extlang") && prefix != null) {
|
||||
tag = prefix + "-" + tag;
|
||||
}
|
||||
|
||||
if (type.equals("region") || type.equals("variant")) {
|
||||
if (!initialRegionVariantMap.containsKey(preferred)) {
|
||||
sb = new StringBuilder("-");
|
||||
@@ -132,7 +113,7 @@ public class EquivMapsGenerator {
|
||||
+ " A region/variant subtag \"" + preferred
|
||||
+ "\" is registered for more than one subtags.");
|
||||
}
|
||||
} else { // language, extlang, grandfathered, and redundant
|
||||
} else { // language, grandfahered, and redundant
|
||||
if (!initialLanguageMap.containsKey(preferred)) {
|
||||
sb = new StringBuilder(preferred);
|
||||
sb.append(',');
|
||||
@@ -150,12 +131,7 @@ public class EquivMapsGenerator {
|
||||
private static void generateEquivalentMap() {
|
||||
String[] subtags;
|
||||
for (String preferred : initialLanguageMap.keySet()) {
|
||||
// There are cases where the same tag may appear in two entries, e.g.,
|
||||
// "yue" is defined both as extlang and redundant. Remove the dup.
|
||||
subtags = Arrays.stream(initialLanguageMap.get(preferred).toString().split(","))
|
||||
.distinct()
|
||||
.collect(Collectors.toList())
|
||||
.toArray(new String[0]);
|
||||
subtags = initialLanguageMap.get(preferred).toString().split(",");
|
||||
|
||||
if (subtags.length == 2) {
|
||||
sortedLanguageMap1.put(subtags[0], subtags[1]);
|
||||
@@ -239,7 +215,10 @@ public class EquivMapsGenerator {
|
||||
+ " static final Map<String, String[]> multiEquivsMap;\n"
|
||||
+ " static final Map<String, String> regionVariantEquivMap;\n\n"
|
||||
+ " static {\n"
|
||||
+ " singleEquivMap = new HashMap<>(";
|
||||
+ " singleEquivMap = new HashMap<>();\n"
|
||||
+ " multiEquivsMap = new HashMap<>();\n"
|
||||
+ " regionVariantEquivMap = new HashMap<>();\n\n"
|
||||
+ " // This is an auto-generated file and should not be manually edited.\n";
|
||||
|
||||
private static final String footerText =
|
||||
" }\n\n"
|
||||
@@ -263,12 +242,6 @@ public class EquivMapsGenerator {
|
||||
Paths.get(fileName))) {
|
||||
writer.write(getOpenJDKCopyright());
|
||||
writer.write(headerText
|
||||
+ (int)(sortedLanguageMap1.size() / 0.75f + 1) + ");\n"
|
||||
+ " multiEquivsMap = new HashMap<>("
|
||||
+ (int)(sortedLanguageMap2.size() / 0.75f + 1) + ");\n"
|
||||
+ " regionVariantEquivMap = new HashMap<>("
|
||||
+ (int)(sortedRegionVariantMap.size() / 0.75f + 1) + ");\n\n"
|
||||
+ " // This is an auto-generated file and should not be manually edited.\n"
|
||||
+ " // LSR Revision: " + LSRrevisionDate);
|
||||
writer.newLine();
|
||||
|
||||
|
||||
@@ -245,6 +245,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBAWT, \
|
||||
LIBS_macosx := -lmlib_image \
|
||||
-framework Cocoa \
|
||||
-framework OpenGL \
|
||||
-framework JavaNativeFoundation \
|
||||
-framework JavaRuntimeSupport \
|
||||
-framework ApplicationServices \
|
||||
-framework AudioToolbox, \
|
||||
@@ -390,7 +391,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBLCMS, \
|
||||
common/awt/debug \
|
||||
libawt/java2d, \
|
||||
HEADERS_FROM_SRC := $(LIBLCMS_HEADERS_FROM_SRC), \
|
||||
DISABLED_WARNINGS_gcc := format-nonliteral type-limits misleading-indentation stringop-truncation, \
|
||||
DISABLED_WARNINGS_gcc := format-nonliteral type-limits misleading-indentation, \
|
||||
DISABLED_WARNINGS_clang := tautological-compare, \
|
||||
DISABLED_WARNINGS_solstudio := E_STATEMENT_NOT_REACHED, \
|
||||
DISABLED_WARNINGS_microsoft := 4819, \
|
||||
@@ -864,7 +865,8 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
|
||||
$(LIBM) -lpthread -liconv -losxapp \
|
||||
-framework ApplicationServices \
|
||||
-framework Foundation \
|
||||
-framework Cocoa
|
||||
-framework Cocoa \
|
||||
-framework JavaNativeFoundation
|
||||
else ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
LIBSPLASHSCREEN_LIBS += kernel32.lib user32.lib gdi32.lib delayimp.lib $(WIN_JAVA_LIB) jvm.lib
|
||||
else
|
||||
@@ -960,6 +962,7 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
-framework Cocoa \
|
||||
-framework Security \
|
||||
-framework ExceptionHandling \
|
||||
-framework JavaNativeFoundation \
|
||||
-framework JavaRuntimeSupport \
|
||||
-framework OpenGL \
|
||||
-framework QuartzCore -ljava, \
|
||||
@@ -997,6 +1000,7 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
-framework Cocoa \
|
||||
-framework Carbon \
|
||||
-framework ApplicationServices \
|
||||
-framework JavaNativeFoundation \
|
||||
-framework JavaRuntimeSupport \
|
||||
-ljava -ljvm, \
|
||||
))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2019, 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
|
||||
@@ -110,9 +110,9 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
LIBS := \
|
||||
-lobjc \
|
||||
-framework JavaNativeFoundation \
|
||||
-framework CoreServices \
|
||||
-framework Security \
|
||||
-framework Foundation \
|
||||
$(JDKLIB_LIBS), \
|
||||
))
|
||||
|
||||
|
||||
@@ -96,7 +96,6 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
LIBS := \
|
||||
-ljava \
|
||||
-framework Accelerate \
|
||||
-framework ApplicationServices \
|
||||
-framework AudioToolbox \
|
||||
@@ -104,14 +103,13 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
-framework Cocoa \
|
||||
-framework Security \
|
||||
-framework ExceptionHandling \
|
||||
-framework JavaNativeFoundation \
|
||||
-framework JavaRuntimeSupport \
|
||||
-framework OpenGL \
|
||||
-framework IOSurface \
|
||||
-framework QuartzCore, \
|
||||
))
|
||||
|
||||
$(BUILD_LIBOSXAPP): $(call FindLib, java.base, java)
|
||||
|
||||
TARGETS += $(BUILD_LIBOSXAPP)
|
||||
|
||||
##############################################################################
|
||||
@@ -129,6 +127,7 @@ ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
-losxapp \
|
||||
-framework Cocoa \
|
||||
-framework ApplicationServices \
|
||||
-framework JavaNativeFoundation \
|
||||
-framework JavaRuntimeSupport \
|
||||
-framework SystemConfiguration \
|
||||
$(JDKLIB_LIBS), \
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
# Copyright (c) 2011, 2019, 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
|
||||
@@ -78,8 +78,8 @@ ifneq ($(BUILD_CRYPTO), false)
|
||||
DISABLED_WARNINGS_clang := deprecated-declarations, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) \
|
||||
$(call SET_SHARED_LIBRARY_ORIGIN), \
|
||||
LIBS := -framework Cocoa -framework SystemConfiguration \
|
||||
-framework Kerberos, \
|
||||
LIBS := -framework JavaNativeFoundation -framework Cocoa \
|
||||
-framework SystemConfiguration -framework Kerberos, \
|
||||
))
|
||||
|
||||
TARGETS += $(BUILD_LIBOSXKRB5)
|
||||
|
||||
@@ -67,7 +67,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBSA, \
|
||||
LDFLAGS := $(LDFLAGS_JDKLIB) $(SA_LDFLAGS), \
|
||||
LIBS_linux := -lthread_db $(LIBDL), \
|
||||
LIBS_solaris := -ldl -ldemangle -lthread -lproc, \
|
||||
LIBS_macosx := -framework Foundation \
|
||||
LIBS_macosx := -framework Foundation -framework JavaNativeFoundation \
|
||||
-framework JavaRuntimeSupport -framework Security -framework CoreFoundation, \
|
||||
LIBS_windows := dbgeng.lib, \
|
||||
))
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
#
|
||||
# Copyright (c) 2015, 2021, 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
|
||||
@@ -76,13 +76,11 @@ else
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
||||
BUILD_JDK_JTREG_LIBRARIES_CFLAGS_libTestMainKeyWindow := -ObjC
|
||||
BUILD_JDK_JTREG_LIBRARIES_LIBS_libTestMainKeyWindow := \
|
||||
-framework Cocoa
|
||||
BUILD_JDK_JTREG_LIBRARIES_LIBS_libTestDynamicStore := \
|
||||
-framework Cocoa -framework SystemConfiguration
|
||||
-framework Cocoa -framework JavaNativeFoundation
|
||||
else
|
||||
BUILD_JDK_JTREG_EXCLUDE += libTestMainKeyWindow.m
|
||||
BUILD_JDK_JTREG_EXCLUDE += libTestDynamicStore.m
|
||||
BUILD_JDK_JTREG_EXCLUDE += libTestMainKeyWindow.c
|
||||
endif
|
||||
|
||||
ifeq ($(OPENJDK_TARGET_OS), windows)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1747,14 +1747,13 @@ static enum RC rc_class(OptoReg::Name reg) {
|
||||
|
||||
// we have 30 int registers * 2 halves
|
||||
// (rscratch1 and rscratch2 are omitted)
|
||||
int slots_of_int_registers = RegisterImpl::max_slots_per_register * (RegisterImpl::number_of_registers - 2);
|
||||
|
||||
if (reg < slots_of_int_registers) {
|
||||
if (reg < 60) {
|
||||
return rc_int;
|
||||
}
|
||||
|
||||
// we have 32 float register * 4 halves
|
||||
if (reg < slots_of_int_registers + FloatRegisterImpl::max_slots_per_register * FloatRegisterImpl::number_of_registers) {
|
||||
// we have 32 float register * 2 halves
|
||||
if (reg < 60 + 128) {
|
||||
return rc_float;
|
||||
}
|
||||
|
||||
@@ -3014,7 +3013,7 @@ encode %{
|
||||
if (con < (address)(uintptr_t)os::vm_page_size()) {
|
||||
__ mov(dst_reg, con);
|
||||
} else {
|
||||
uint64_t offset;
|
||||
uintptr_t offset;
|
||||
__ adrp(dst_reg, con, offset);
|
||||
__ add(dst_reg, dst_reg, offset);
|
||||
}
|
||||
@@ -3270,19 +3269,12 @@ encode %{
|
||||
if (!_method) {
|
||||
// A call to a runtime wrapper, e.g. new, new_typeArray_Java, uncommon_trap.
|
||||
call = __ trampoline_call(Address(addr, relocInfo::runtime_call_type), &cbuf);
|
||||
if (call == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
int method_index = resolved_method_index(cbuf);
|
||||
RelocationHolder rspec = _optimized_virtual ? opt_virtual_call_Relocation::spec(method_index)
|
||||
: static_call_Relocation::spec(method_index);
|
||||
call = __ trampoline_call(Address(addr, rspec), &cbuf);
|
||||
if (call == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
|
||||
// Emit stub for static call
|
||||
address stub = CompiledStaticCall::emit_to_interp_stub(cbuf);
|
||||
if (stub == NULL) {
|
||||
@@ -3290,6 +3282,10 @@ encode %{
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (call == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
%}
|
||||
|
||||
enc_class aarch64_enc_java_dynamic_call(method meth) %{
|
||||
@@ -3938,18 +3934,6 @@ operand immI_bitmask()
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
operand immL_positive_bitmaskI()
|
||||
%{
|
||||
predicate((n->get_long() != 0)
|
||||
&& ((julong)n->get_long() < 0x80000000ULL)
|
||||
&& is_power_of_2(n->get_long() + 1));
|
||||
match(ConL);
|
||||
|
||||
op_cost(0);
|
||||
format %{ %}
|
||||
interface(CONST_INTER);
|
||||
%}
|
||||
|
||||
// Scale values for scaled offset addressing modes (up to long but not quad)
|
||||
operand immIScale()
|
||||
%{
|
||||
@@ -9952,56 +9936,6 @@ instruct msubL(iRegLNoSp dst, iRegL src1, iRegL src2, iRegL src3) %{
|
||||
ins_pipe(lmac_reg_reg);
|
||||
%}
|
||||
|
||||
// Combine Integer Signed Multiply & Add/Sub/Neg Long
|
||||
|
||||
instruct smaddL(iRegLNoSp dst, iRegIorL2I src1, iRegIorL2I src2, iRegLNoSp src3) %{
|
||||
match(Set dst (AddL src3 (MulL (ConvI2L src1) (ConvI2L src2))));
|
||||
|
||||
ins_cost(INSN_COST * 3);
|
||||
format %{ "smaddl $dst, $src1, $src2, $src3" %}
|
||||
|
||||
ins_encode %{
|
||||
__ smaddl(as_Register($dst$$reg),
|
||||
as_Register($src1$$reg),
|
||||
as_Register($src2$$reg),
|
||||
as_Register($src3$$reg));
|
||||
%}
|
||||
|
||||
ins_pipe(imac_reg_reg);
|
||||
%}
|
||||
|
||||
instruct smsubL(iRegLNoSp dst, iRegIorL2I src1, iRegIorL2I src2, iRegLNoSp src3) %{
|
||||
match(Set dst (SubL src3 (MulL (ConvI2L src1) (ConvI2L src2))));
|
||||
|
||||
ins_cost(INSN_COST * 3);
|
||||
format %{ "smsubl $dst, $src1, $src2, $src3" %}
|
||||
|
||||
ins_encode %{
|
||||
__ smsubl(as_Register($dst$$reg),
|
||||
as_Register($src1$$reg),
|
||||
as_Register($src2$$reg),
|
||||
as_Register($src3$$reg));
|
||||
%}
|
||||
|
||||
ins_pipe(imac_reg_reg);
|
||||
%}
|
||||
|
||||
instruct smnegL(iRegLNoSp dst, iRegIorL2I src1, iRegIorL2I src2, immL0 zero) %{
|
||||
match(Set dst (MulL (SubL zero (ConvI2L src1)) (ConvI2L src2)));
|
||||
match(Set dst (MulL (ConvI2L src1) (SubL zero (ConvI2L src2))));
|
||||
|
||||
ins_cost(INSN_COST * 3);
|
||||
format %{ "smnegl $dst, $src1, $src2" %}
|
||||
|
||||
ins_encode %{
|
||||
__ smnegl(as_Register($dst$$reg),
|
||||
as_Register($src1$$reg),
|
||||
as_Register($src2$$reg));
|
||||
%}
|
||||
|
||||
ins_pipe(imac_reg_reg);
|
||||
%}
|
||||
|
||||
// Integer Divide
|
||||
|
||||
instruct divI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
|
||||
@@ -10014,6 +9948,30 @@ instruct divI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
|
||||
ins_pipe(idiv_reg_reg);
|
||||
%}
|
||||
|
||||
instruct signExtract(iRegINoSp dst, iRegIorL2I src1, immI_31 div1, immI_31 div2) %{
|
||||
match(Set dst (URShiftI (RShiftI src1 div1) div2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "lsrw $dst, $src1, $div1" %}
|
||||
ins_encode %{
|
||||
__ lsrw(as_Register($dst$$reg), as_Register($src1$$reg), 31);
|
||||
%}
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
instruct div2Round(iRegINoSp dst, iRegIorL2I src, immI_31 div1, immI_31 div2) %{
|
||||
match(Set dst (AddI src (URShiftI (RShiftI src div1) div2)));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "addw $dst, $src, LSR $div1" %}
|
||||
|
||||
ins_encode %{
|
||||
__ addw(as_Register($dst$$reg),
|
||||
as_Register($src$$reg),
|
||||
as_Register($src$$reg),
|
||||
Assembler::LSR, 31);
|
||||
%}
|
||||
ins_pipe(ialu_reg);
|
||||
%}
|
||||
|
||||
// Long Divide
|
||||
|
||||
instruct divL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
|
||||
@@ -10026,6 +9984,30 @@ instruct divL(iRegLNoSp dst, iRegL src1, iRegL src2) %{
|
||||
ins_pipe(ldiv_reg_reg);
|
||||
%}
|
||||
|
||||
instruct signExtractL(iRegLNoSp dst, iRegL src1, immI_63 div1, immI_63 div2) %{
|
||||
match(Set dst (URShiftL (RShiftL src1 div1) div2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "lsr $dst, $src1, $div1" %}
|
||||
ins_encode %{
|
||||
__ lsr(as_Register($dst$$reg), as_Register($src1$$reg), 63);
|
||||
%}
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
instruct div2RoundL(iRegLNoSp dst, iRegL src, immI_63 div1, immI_63 div2) %{
|
||||
match(Set dst (AddL src (URShiftL (RShiftL src div1) div2)));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "add $dst, $src, $div1" %}
|
||||
|
||||
ins_encode %{
|
||||
__ add(as_Register($dst$$reg),
|
||||
as_Register($src$$reg),
|
||||
as_Register($src$$reg),
|
||||
Assembler::LSR, 63);
|
||||
%}
|
||||
ins_pipe(ialu_reg);
|
||||
%}
|
||||
|
||||
// Integer Remainder
|
||||
|
||||
instruct modI(iRegINoSp dst, iRegIorL2I src1, iRegIorL2I src2) %{
|
||||
@@ -11572,6 +11554,9 @@ instruct ubfxIConvI2L(iRegLNoSp dst, iRegIorL2I src, immI rshift, immI_bitmask m
|
||||
%}
|
||||
|
||||
|
||||
// This pattern is automatically generated from aarch64_ad.m4
|
||||
// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
|
||||
|
||||
// We can use ubfiz when masking by a positive number and then left shifting the result.
|
||||
// We know that the mask is positive because immI_bitmask guarantees it.
|
||||
instruct ubfizwI(iRegINoSp dst, iRegIorL2I src, immI lshift, immI_bitmask mask)
|
||||
@@ -11591,6 +11576,9 @@ instruct ubfizwI(iRegINoSp dst, iRegIorL2I src, immI lshift, immI_bitmask mask)
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
// This pattern is automatically generated from aarch64_ad.m4
|
||||
// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
|
||||
|
||||
// We can use ubfiz when masking by a positive number and then left shifting the result.
|
||||
// We know that the mask is positive because immL_bitmask guarantees it.
|
||||
instruct ubfizL(iRegLNoSp dst, iRegL src, immI lshift, immL_bitmask mask)
|
||||
@@ -11610,44 +11598,9 @@ instruct ubfizL(iRegLNoSp dst, iRegL src, immI lshift, immL_bitmask mask)
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
// We can use ubfiz when masking by a positive number and then left shifting the result.
|
||||
// We know that the mask is positive because immI_bitmask guarantees it.
|
||||
instruct ubfizwIConvI2L(iRegLNoSp dst, iRegIorL2I src, immI lshift, immI_bitmask mask)
|
||||
%{
|
||||
match(Set dst (ConvI2L (LShiftI (AndI src mask) lshift)));
|
||||
predicate((exact_log2(n->in(1)->in(1)->in(2)->get_int() + 1) + (n->in(1)->in(2)->get_int() & 31)) <= 31);
|
||||
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "ubfizw $dst, $src, $lshift, $mask" %}
|
||||
ins_encode %{
|
||||
int lshift = $lshift$$constant & 31;
|
||||
long mask = $mask$$constant;
|
||||
int width = exact_log2(mask+1);
|
||||
__ ubfizw(as_Register($dst$$reg),
|
||||
as_Register($src$$reg), lshift, width);
|
||||
%}
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
// We can use ubfiz when masking by a positive number and then left shifting the result.
|
||||
// We know that the mask is positive because immL_bitmask guarantees it.
|
||||
instruct ubfizLConvL2I(iRegINoSp dst, iRegL src, immI lshift, immL_positive_bitmaskI mask)
|
||||
%{
|
||||
match(Set dst (ConvL2I (LShiftL (AndL src mask) lshift)));
|
||||
predicate((exact_log2_long(n->in(1)->in(1)->in(2)->get_long() + 1) + (n->in(1)->in(2)->get_int() & 63)) <= 31);
|
||||
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "ubfiz $dst, $src, $lshift, $mask" %}
|
||||
ins_encode %{
|
||||
int lshift = $lshift$$constant & 63;
|
||||
long mask = $mask$$constant;
|
||||
int width = exact_log2_long(mask+1);
|
||||
__ ubfiz(as_Register($dst$$reg),
|
||||
as_Register($src$$reg), lshift, width);
|
||||
%}
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
// This pattern is automatically generated from aarch64_ad.m4
|
||||
// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
|
||||
|
||||
// If there is a convert I to L block between and AndI and a LShiftL, we can also match ubfiz
|
||||
instruct ubfizIConvI2L(iRegLNoSp dst, iRegIorL2I src, immI lshift, immI_bitmask mask)
|
||||
@@ -11667,37 +11620,6 @@ instruct ubfizIConvI2L(iRegLNoSp dst, iRegIorL2I src, immI lshift, immI_bitmask
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
// If there is a convert L to I block between and AndL and a LShiftI, we can also match ubfiz
|
||||
instruct ubfizLConvL2Ix(iRegINoSp dst, iRegL src, immI lshift, immL_positive_bitmaskI mask)
|
||||
%{
|
||||
match(Set dst (LShiftI (ConvL2I (AndL src mask)) lshift));
|
||||
predicate((exact_log2_long(n->in(1)->in(1)->in(2)->get_long() + 1) + (n->in(2)->get_int() & 31)) <= 31);
|
||||
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "ubfiz $dst, $src, $lshift, $mask" %}
|
||||
ins_encode %{
|
||||
int lshift = $lshift$$constant & 31;
|
||||
long mask = $mask$$constant;
|
||||
int width = exact_log2(mask+1);
|
||||
__ ubfiz(as_Register($dst$$reg),
|
||||
as_Register($src$$reg), lshift, width);
|
||||
%}
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
// Can skip int2long conversions after AND with small bitmask
|
||||
instruct ubfizIConvI2LAndI(iRegLNoSp dst, iRegI src, immI_bitmask msk)
|
||||
%{
|
||||
match(Set dst (ConvI2L (AndI src msk)));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "ubfiz $dst, $src, 0, exact_log2($msk + 1) " %}
|
||||
ins_encode %{
|
||||
__ ubfiz(as_Register($dst$$reg), as_Register($src$$reg), 0, exact_log2($msk$$constant + 1));
|
||||
%}
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
// Rotations
|
||||
|
||||
// Rotations
|
||||
// This pattern is automatically generated from aarch64_ad.m4
|
||||
@@ -12904,40 +12826,6 @@ instruct negD_reg_reg(vRegD dst, vRegD src) %{
|
||||
ins_pipe(fp_uop_d);
|
||||
%}
|
||||
|
||||
instruct absI_reg(iRegINoSp dst, iRegIorL2I src, rFlagsReg cr)
|
||||
%{
|
||||
match(Set dst (AbsI src));
|
||||
|
||||
effect(KILL cr);
|
||||
ins_cost(INSN_COST * 2);
|
||||
format %{ "cmpw $src, zr\n\t"
|
||||
"cnegw $dst, $src, Assembler::LT\t# int abs"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpw(as_Register($src$$reg), zr);
|
||||
__ cnegw(as_Register($dst$$reg), as_Register($src$$reg), Assembler::LT);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct absL_reg(iRegLNoSp dst, iRegL src, rFlagsReg cr)
|
||||
%{
|
||||
match(Set dst (AbsL src));
|
||||
|
||||
effect(KILL cr);
|
||||
ins_cost(INSN_COST * 2);
|
||||
format %{ "cmp $src, zr\n\t"
|
||||
"cneg $dst, $src, Assembler::LT\t# long abs"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmp(as_Register($src$$reg), zr);
|
||||
__ cneg(as_Register($dst$$reg), as_Register($src$$reg), Assembler::LT);
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct absF_reg(vRegF dst, vRegF src) %{
|
||||
match(Set dst (AbsF src));
|
||||
|
||||
@@ -12978,7 +12866,7 @@ instruct sqrtD_reg(vRegD dst, vRegD src) %{
|
||||
%}
|
||||
|
||||
instruct sqrtF_reg(vRegF dst, vRegF src) %{
|
||||
match(Set dst (SqrtF src));
|
||||
match(Set dst (ConvD2F (SqrtD (ConvF2D src))));
|
||||
|
||||
ins_cost(INSN_COST * 50);
|
||||
format %{ "fsqrts $dst, $src" %}
|
||||
@@ -12990,77 +12878,6 @@ instruct sqrtF_reg(vRegF dst, vRegF src) %{
|
||||
ins_pipe(fp_div_d);
|
||||
%}
|
||||
|
||||
instruct copySignD_reg(vRegD dst, vRegD src1, vRegD src2, vRegD zero) %{
|
||||
match(Set dst (CopySignD src1 (Binary src2 zero)));
|
||||
effect(TEMP_DEF dst, USE src1, USE src2, USE zero);
|
||||
format %{ "CopySignD $dst $src1 $src2" %}
|
||||
ins_encode %{
|
||||
FloatRegister dst = as_FloatRegister($dst$$reg),
|
||||
src1 = as_FloatRegister($src1$$reg),
|
||||
src2 = as_FloatRegister($src2$$reg),
|
||||
zero = as_FloatRegister($zero$$reg);
|
||||
__ fnegd(dst, zero);
|
||||
__ bsl(dst, __ T8B, src2, src1);
|
||||
%}
|
||||
ins_pipe(fp_uop_d);
|
||||
%}
|
||||
|
||||
instruct copySignF_reg(vRegF dst, vRegF src1, vRegF src2) %{
|
||||
match(Set dst (CopySignF src1 src2));
|
||||
effect(TEMP_DEF dst, USE src1, USE src2);
|
||||
format %{ "CopySignF $dst $src1 $src2" %}
|
||||
ins_encode %{
|
||||
FloatRegister dst = as_FloatRegister($dst$$reg),
|
||||
src1 = as_FloatRegister($src1$$reg),
|
||||
src2 = as_FloatRegister($src2$$reg);
|
||||
__ movi(dst, __ T2S, 0x80, 24);
|
||||
__ bsl(dst, __ T8B, src2, src1);
|
||||
%}
|
||||
ins_pipe(fp_uop_d);
|
||||
%}
|
||||
|
||||
instruct signumD_reg(vRegD dst, vRegD src, vRegD zero, vRegD one) %{
|
||||
match(Set dst (SignumD src (Binary zero one)));
|
||||
effect(TEMP_DEF dst, USE src, USE zero, USE one);
|
||||
format %{ "signumD $dst, $src" %}
|
||||
ins_encode %{
|
||||
FloatRegister src = as_FloatRegister($src$$reg),
|
||||
dst = as_FloatRegister($dst$$reg),
|
||||
zero = as_FloatRegister($zero$$reg),
|
||||
one = as_FloatRegister($one$$reg);
|
||||
__ facgtd(dst, src, zero); // dst=0 for +-0.0 and NaN. 0xFFF..F otherwise
|
||||
__ ushrd(dst, dst, 1); // dst=0 for +-0.0 and NaN. 0x7FF..F otherwise
|
||||
// Bit selection instruction gets bit from "one" for each enabled bit in
|
||||
// "dst", otherwise gets a bit from "src". For "src" that contains +-0.0 or
|
||||
// NaN the whole "src" will be copied because "dst" is zero. For all other
|
||||
// "src" values dst is 0x7FF..F, which means only the sign bit is copied
|
||||
// from "src", and all other bits are copied from 1.0.
|
||||
__ bsl(dst, __ T8B, one, src);
|
||||
%}
|
||||
ins_pipe(fp_uop_d);
|
||||
%}
|
||||
|
||||
instruct signumF_reg(vRegF dst, vRegF src, vRegF zero, vRegF one) %{
|
||||
match(Set dst (SignumF src (Binary zero one)));
|
||||
effect(TEMP_DEF dst, USE src, USE zero, USE one);
|
||||
format %{ "signumF $dst, $src" %}
|
||||
ins_encode %{
|
||||
FloatRegister src = as_FloatRegister($src$$reg),
|
||||
dst = as_FloatRegister($dst$$reg),
|
||||
zero = as_FloatRegister($zero$$reg),
|
||||
one = as_FloatRegister($one$$reg);
|
||||
__ facgts(dst, src, zero); // dst=0 for +-0.0 and NaN. 0xFFF..F otherwise
|
||||
__ ushr(dst, __ T2S, dst, 1); // dst=0 for +-0.0 and NaN. 0x7FF..F otherwise
|
||||
// Bit selection instruction gets bit from "one" for each enabled bit in
|
||||
// "dst", otherwise gets a bit from "src". For "src" that contains +-0.0 or
|
||||
// NaN the whole "src" will be copied because "dst" is zero. For all other
|
||||
// "src" values dst is 0x7FF..F, which means only the sign bit is copied
|
||||
// from "src", and all other bits are copied from 1.0.
|
||||
__ bsl(dst, __ T8B, one, src);
|
||||
%}
|
||||
ins_pipe(fp_uop_d);
|
||||
%}
|
||||
|
||||
// ============================================================================
|
||||
// Logical Instructions
|
||||
|
||||
@@ -13695,11 +13512,7 @@ instruct clearArray_reg_reg(iRegL_R11 cnt, iRegP_R10 base, Universe dummy, rFlag
|
||||
format %{ "ClearArray $cnt, $base" %}
|
||||
|
||||
ins_encode %{
|
||||
address tpc = __ zero_words($base$$Register, $cnt$$Register);
|
||||
if (tpc == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
__ zero_words($base$$Register, $cnt$$Register);
|
||||
%}
|
||||
|
||||
ins_pipe(pipe_class_memory);
|
||||
@@ -14442,63 +14255,55 @@ instruct cmpLTMask_reg_zero(iRegINoSp dst, iRegIorL2I src, immI0 zero, rFlagsReg
|
||||
// ============================================================================
|
||||
// Max and Min
|
||||
|
||||
instruct cmovI_reg_reg_lt(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
|
||||
instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
|
||||
%{
|
||||
effect( DEF dst, USE src1, USE src2, USE cr );
|
||||
match(Set dst (MinI src1 src2));
|
||||
|
||||
ins_cost(INSN_COST * 2);
|
||||
format %{ "cselw $dst, $src1, $src2 lt\t" %}
|
||||
effect(DEF dst, USE src1, USE src2, KILL cr);
|
||||
size(8);
|
||||
|
||||
ins_cost(INSN_COST * 3);
|
||||
format %{
|
||||
"cmpw $src1 $src2\t signed int\n\t"
|
||||
"cselw $dst, $src1, $src2 lt\t"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpw(as_Register($src1$$reg),
|
||||
as_Register($src2$$reg));
|
||||
__ cselw(as_Register($dst$$reg),
|
||||
as_Register($src1$$reg),
|
||||
as_Register($src2$$reg),
|
||||
Assembler::LT);
|
||||
%}
|
||||
|
||||
ins_pipe(icond_reg_reg);
|
||||
%}
|
||||
|
||||
instruct minI_rReg(iRegINoSp dst, iRegI src1, iRegI src2)
|
||||
%{
|
||||
match(Set dst (MinI src1 src2));
|
||||
ins_cost(INSN_COST * 3);
|
||||
|
||||
expand %{
|
||||
rFlagsReg cr;
|
||||
compI_reg_reg(cr, src1, src2);
|
||||
cmovI_reg_reg_lt(dst, src1, src2, cr);
|
||||
%}
|
||||
|
||||
ins_pipe(ialu_reg_reg);
|
||||
%}
|
||||
// FROM HERE
|
||||
|
||||
instruct cmovI_reg_reg_gt(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
|
||||
instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2, rFlagsReg cr)
|
||||
%{
|
||||
effect( DEF dst, USE src1, USE src2, USE cr );
|
||||
match(Set dst (MaxI src1 src2));
|
||||
|
||||
ins_cost(INSN_COST * 2);
|
||||
format %{ "cselw $dst, $src1, $src2 gt\t" %}
|
||||
effect(DEF dst, USE src1, USE src2, KILL cr);
|
||||
size(8);
|
||||
|
||||
ins_cost(INSN_COST * 3);
|
||||
format %{
|
||||
"cmpw $src1 $src2\t signed int\n\t"
|
||||
"cselw $dst, $src1, $src2 gt\t"
|
||||
%}
|
||||
|
||||
ins_encode %{
|
||||
__ cmpw(as_Register($src1$$reg),
|
||||
as_Register($src2$$reg));
|
||||
__ cselw(as_Register($dst$$reg),
|
||||
as_Register($src1$$reg),
|
||||
as_Register($src2$$reg),
|
||||
Assembler::GT);
|
||||
%}
|
||||
|
||||
ins_pipe(icond_reg_reg);
|
||||
%}
|
||||
|
||||
instruct maxI_rReg(iRegINoSp dst, iRegI src1, iRegI src2)
|
||||
%{
|
||||
match(Set dst (MaxI src1 src2));
|
||||
ins_cost(INSN_COST * 3);
|
||||
expand %{
|
||||
rFlagsReg cr;
|
||||
compI_reg_reg(cr, src1, src2);
|
||||
cmovI_reg_reg_gt(dst, src1, src2, cr);
|
||||
%}
|
||||
ins_pipe(ialu_reg_reg);
|
||||
%}
|
||||
|
||||
// ============================================================================
|
||||
@@ -15443,14 +15248,10 @@ instruct array_equalsB(iRegP_R1 ary1, iRegP_R2 ary2, iRegI_R0 result,
|
||||
|
||||
format %{ "Array Equals $ary1,ary2 -> $result // KILL $tmp" %}
|
||||
ins_encode %{
|
||||
address tpc = __ arrays_equals($ary1$$Register, $ary2$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register,
|
||||
$result$$Register, $tmp$$Register, 1);
|
||||
if (tpc == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
%}
|
||||
__ arrays_equals($ary1$$Register, $ary2$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register,
|
||||
$result$$Register, $tmp$$Register, 1);
|
||||
%}
|
||||
ins_pipe(pipe_class_memory);
|
||||
%}
|
||||
|
||||
@@ -15464,13 +15265,9 @@ instruct array_equalsC(iRegP_R1 ary1, iRegP_R2 ary2, iRegI_R0 result,
|
||||
|
||||
format %{ "Array Equals $ary1,ary2 -> $result // KILL $tmp" %}
|
||||
ins_encode %{
|
||||
address tpc = __ arrays_equals($ary1$$Register, $ary2$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register,
|
||||
$result$$Register, $tmp$$Register, 2);
|
||||
if (tpc == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
__ arrays_equals($ary1$$Register, $ary2$$Register,
|
||||
$tmp1$$Register, $tmp2$$Register, $tmp3$$Register,
|
||||
$result$$Register, $tmp$$Register, 2);
|
||||
%}
|
||||
ins_pipe(pipe_class_memory);
|
||||
%}
|
||||
@@ -15481,11 +15278,7 @@ instruct has_negatives(iRegP_R1 ary1, iRegI_R2 len, iRegI_R0 result, rFlagsReg c
|
||||
effect(USE_KILL ary1, USE_KILL len, KILL cr);
|
||||
format %{ "has negatives byte[] $ary1,$len -> $result" %}
|
||||
ins_encode %{
|
||||
address tpc = __ has_negatives($ary1$$Register, $len$$Register, $result$$Register);
|
||||
if (tpc == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
__ has_negatives($ary1$$Register, $len$$Register, $result$$Register);
|
||||
%}
|
||||
ins_pipe( pipe_slow );
|
||||
%}
|
||||
@@ -15518,13 +15311,8 @@ instruct string_inflate(Universe dummy, iRegP_R0 src, iRegP_R1 dst, iRegI_R2 len
|
||||
|
||||
format %{ "String Inflate $src,$dst // KILL $tmp1, $tmp2" %}
|
||||
ins_encode %{
|
||||
address tpc = __ byte_array_inflate($src$$Register, $dst$$Register, $len$$Register,
|
||||
$tmp1$$FloatRegister, $tmp2$$FloatRegister,
|
||||
$tmp3$$FloatRegister, $tmp4$$Register);
|
||||
if (tpc == NULL) {
|
||||
ciEnv::current()->record_failure("CodeCache is full");
|
||||
return;
|
||||
}
|
||||
__ byte_array_inflate($src$$Register, $dst$$Register, $len$$Register,
|
||||
$tmp1$$FloatRegister, $tmp2$$FloatRegister, $tmp3$$FloatRegister, $tmp4$$Register);
|
||||
%}
|
||||
ins_pipe(pipe_class_memory);
|
||||
%}
|
||||
@@ -16075,98 +15863,6 @@ instruct reduce_mul2D(vRegD dst, vRegD src1, vecX src2, vecX tmp)
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct reduce_max2F(vRegF dst, vRegF src1, vecD src2, vecD tmp) %{
|
||||
predicate(n->in(2)->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
|
||||
match(Set dst (MaxReductionV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
effect(TEMP_DEF dst, TEMP tmp);
|
||||
format %{ "fmaxs $dst, $src1, $src2\n\t"
|
||||
"ins $tmp, S, $src2, 0, 1\n\t"
|
||||
"fmaxs $dst, $dst, $tmp\t# max reduction2F" %}
|
||||
ins_encode %{
|
||||
__ fmaxs(as_FloatRegister($dst$$reg), as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
|
||||
__ ins(as_FloatRegister($tmp$$reg), __ S, as_FloatRegister($src2$$reg), 0, 1);
|
||||
__ fmaxs(as_FloatRegister($dst$$reg), as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg));
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct reduce_max4F(vRegF dst, vRegF src1, vecX src2) %{
|
||||
predicate(n->in(2)->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
|
||||
match(Set dst (MaxReductionV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
effect(TEMP_DEF dst);
|
||||
format %{ "fmaxv $dst, T4S, $src2\n\t"
|
||||
"fmaxs $dst, $dst, $src1\t# max reduction4F" %}
|
||||
ins_encode %{
|
||||
__ fmaxv(as_FloatRegister($dst$$reg), __ T4S, as_FloatRegister($src2$$reg));
|
||||
__ fmaxs(as_FloatRegister($dst$$reg), as_FloatRegister($dst$$reg), as_FloatRegister($src1$$reg));
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct reduce_max2D(vRegD dst, vRegD src1, vecX src2, vecX tmp) %{
|
||||
predicate(n->in(2)->bottom_type()->is_vect()->element_basic_type() == T_DOUBLE);
|
||||
match(Set dst (MaxReductionV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
effect(TEMP_DEF dst, TEMP tmp);
|
||||
format %{ "fmaxd $dst, $src1, $src2\n\t"
|
||||
"ins $tmp, D, $src2, 0, 1\n\t"
|
||||
"fmaxd $dst, $dst, $tmp\t# max reduction2D" %}
|
||||
ins_encode %{
|
||||
__ fmaxd(as_FloatRegister($dst$$reg), as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
|
||||
__ ins(as_FloatRegister($tmp$$reg), __ D, as_FloatRegister($src2$$reg), 0, 1);
|
||||
__ fmaxd(as_FloatRegister($dst$$reg), as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg));
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct reduce_min2F(vRegF dst, vRegF src1, vecD src2, vecD tmp) %{
|
||||
predicate(n->in(2)->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
|
||||
match(Set dst (MinReductionV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
effect(TEMP_DEF dst, TEMP tmp);
|
||||
format %{ "fmins $dst, $src1, $src2\n\t"
|
||||
"ins $tmp, S, $src2, 0, 1\n\t"
|
||||
"fmins $dst, $dst, $tmp\t# min reduction2F" %}
|
||||
ins_encode %{
|
||||
__ fmins(as_FloatRegister($dst$$reg), as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
|
||||
__ ins(as_FloatRegister($tmp$$reg), __ S, as_FloatRegister($src2$$reg), 0, 1);
|
||||
__ fmins(as_FloatRegister($dst$$reg), as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg));
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct reduce_min4F(vRegF dst, vRegF src1, vecX src2) %{
|
||||
predicate(n->in(2)->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
|
||||
match(Set dst (MinReductionV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
effect(TEMP_DEF dst);
|
||||
format %{ "fminv $dst, T4S, $src2\n\t"
|
||||
"fmins $dst, $dst, $src1\t# min reduction4F" %}
|
||||
ins_encode %{
|
||||
__ fminv(as_FloatRegister($dst$$reg), __ T4S, as_FloatRegister($src2$$reg));
|
||||
__ fmins(as_FloatRegister($dst$$reg), as_FloatRegister($dst$$reg), as_FloatRegister($src1$$reg));
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct reduce_min2D(vRegD dst, vRegD src1, vecX src2, vecX tmp) %{
|
||||
predicate(n->in(2)->bottom_type()->is_vect()->element_basic_type() == T_DOUBLE);
|
||||
match(Set dst (MinReductionV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
effect(TEMP_DEF dst, TEMP tmp);
|
||||
format %{ "fmind $dst, $src1, $src2\n\t"
|
||||
"ins $tmp, D, $src2, 0, 1\n\t"
|
||||
"fmind $dst, $dst, $tmp\t# min reduction2D" %}
|
||||
ins_encode %{
|
||||
__ fmind(as_FloatRegister($dst$$reg), as_FloatRegister($src1$$reg), as_FloatRegister($src2$$reg));
|
||||
__ ins(as_FloatRegister($tmp$$reg), __ D, as_FloatRegister($src2$$reg), 0, 1);
|
||||
__ fmind(as_FloatRegister($dst$$reg), as_FloatRegister($dst$$reg), as_FloatRegister($tmp$$reg));
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
// ====================VECTOR ARITHMETIC=======================================
|
||||
|
||||
// --------------------------------- ADD --------------------------------------
|
||||
@@ -16458,35 +16154,6 @@ instruct vsub2D(vecX dst, vecX src1, vecX src2)
|
||||
|
||||
// --------------------------------- MUL --------------------------------------
|
||||
|
||||
instruct vmul8B(vecD dst, vecD src1, vecD src2)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 4 ||
|
||||
n->as_Vector()->length() == 8);
|
||||
match(Set dst (MulVB src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "mulv $dst,$src1,$src2\t# vector (8B)" %}
|
||||
ins_encode %{
|
||||
__ mulv(as_FloatRegister($dst$$reg), __ T8B,
|
||||
as_FloatRegister($src1$$reg),
|
||||
as_FloatRegister($src2$$reg));
|
||||
%}
|
||||
ins_pipe(vmul64);
|
||||
%}
|
||||
|
||||
instruct vmul16B(vecX dst, vecX src1, vecX src2)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 16);
|
||||
match(Set dst (MulVB src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "mulv $dst,$src1,$src2\t# vector (16B)" %}
|
||||
ins_encode %{
|
||||
__ mulv(as_FloatRegister($dst$$reg), __ T16B,
|
||||
as_FloatRegister($src1$$reg),
|
||||
as_FloatRegister($src2$$reg));
|
||||
%}
|
||||
ins_pipe(vmul128);
|
||||
%}
|
||||
|
||||
instruct vmul4S(vecD dst, vecD src1, vecD src2)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2 ||
|
||||
@@ -16837,28 +16504,6 @@ instruct vdiv2D(vecX dst, vecX src1, vecX src2)
|
||||
|
||||
// --------------------------------- SQRT -------------------------------------
|
||||
|
||||
instruct vsqrt2F(vecD dst, vecD src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2);
|
||||
match(Set dst (SqrtVF src));
|
||||
format %{ "fsqrt $dst, $src\t# vector (2F)" %}
|
||||
ins_encode %{
|
||||
__ fsqrt(as_FloatRegister($dst$$reg), __ T2S, as_FloatRegister($src$$reg));
|
||||
%}
|
||||
ins_pipe(vunop_fp64);
|
||||
%}
|
||||
|
||||
instruct vsqrt4F(vecX dst, vecX src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 4);
|
||||
match(Set dst (SqrtVF src));
|
||||
format %{ "fsqrt $dst, $src\t# vector (4F)" %}
|
||||
ins_encode %{
|
||||
__ fsqrt(as_FloatRegister($dst$$reg), __ T4S, as_FloatRegister($src$$reg));
|
||||
%}
|
||||
ins_pipe(vsqrt_fp128);
|
||||
%}
|
||||
|
||||
instruct vsqrt2D(vecX dst, vecX src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2);
|
||||
@@ -16873,91 +16518,6 @@ instruct vsqrt2D(vecX dst, vecX src)
|
||||
|
||||
// --------------------------------- ABS --------------------------------------
|
||||
|
||||
instruct vabs8B(vecD dst, vecD src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 4 ||
|
||||
n->as_Vector()->length() == 8);
|
||||
match(Set dst (AbsVB src));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "abs $dst, $src\t# vector (8B)" %}
|
||||
ins_encode %{
|
||||
__ absr(as_FloatRegister($dst$$reg), __ T8B, as_FloatRegister($src$$reg));
|
||||
%}
|
||||
ins_pipe(vlogical64);
|
||||
%}
|
||||
|
||||
instruct vabs16B(vecX dst, vecX src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 16);
|
||||
match(Set dst (AbsVB src));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "abs $dst, $src\t# vector (16B)" %}
|
||||
ins_encode %{
|
||||
__ absr(as_FloatRegister($dst$$reg), __ T16B, as_FloatRegister($src$$reg));
|
||||
%}
|
||||
ins_pipe(vlogical128);
|
||||
%}
|
||||
|
||||
instruct vabs4S(vecD dst, vecD src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 4);
|
||||
match(Set dst (AbsVS src));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "abs $dst, $src\t# vector (4H)" %}
|
||||
ins_encode %{
|
||||
__ absr(as_FloatRegister($dst$$reg), __ T4H, as_FloatRegister($src$$reg));
|
||||
%}
|
||||
ins_pipe(vlogical64);
|
||||
%}
|
||||
|
||||
instruct vabs8S(vecX dst, vecX src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 8);
|
||||
match(Set dst (AbsVS src));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "abs $dst, $src\t# vector (8H)" %}
|
||||
ins_encode %{
|
||||
__ absr(as_FloatRegister($dst$$reg), __ T8H, as_FloatRegister($src$$reg));
|
||||
%}
|
||||
ins_pipe(vlogical128);
|
||||
%}
|
||||
|
||||
instruct vabs2I(vecD dst, vecD src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2);
|
||||
match(Set dst (AbsVI src));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "abs $dst, $src\t# vector (2S)" %}
|
||||
ins_encode %{
|
||||
__ absr(as_FloatRegister($dst$$reg), __ T2S, as_FloatRegister($src$$reg));
|
||||
%}
|
||||
ins_pipe(vlogical64);
|
||||
%}
|
||||
|
||||
instruct vabs4I(vecX dst, vecX src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 4);
|
||||
match(Set dst (AbsVI src));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "abs $dst, $src\t# vector (4S)" %}
|
||||
ins_encode %{
|
||||
__ absr(as_FloatRegister($dst$$reg), __ T4S, as_FloatRegister($src$$reg));
|
||||
%}
|
||||
ins_pipe(vlogical128);
|
||||
%}
|
||||
|
||||
instruct vabs2L(vecX dst, vecX src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2);
|
||||
match(Set dst (AbsVL src));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "abs $dst, $src\t# vector (2D)" %}
|
||||
ins_encode %{
|
||||
__ absr(as_FloatRegister($dst$$reg), __ T2D, as_FloatRegister($src$$reg));
|
||||
%}
|
||||
ins_pipe(vlogical128);
|
||||
%}
|
||||
|
||||
instruct vabs2F(vecD dst, vecD src)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2);
|
||||
@@ -17841,128 +17401,6 @@ instruct vsrl2L_imm(vecX dst, vecX src, immI shift) %{
|
||||
ins_pipe(vshift128_imm);
|
||||
%}
|
||||
|
||||
instruct vmax2F(vecD dst, vecD src1, vecD src2)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2 && n->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
|
||||
match(Set dst (MaxV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "fmax $dst,$src1,$src2\t# vector (2F)" %}
|
||||
ins_encode %{
|
||||
__ fmax(as_FloatRegister($dst$$reg), __ T2S,
|
||||
as_FloatRegister($src1$$reg),
|
||||
as_FloatRegister($src2$$reg));
|
||||
%}
|
||||
ins_pipe(vdop_fp64);
|
||||
%}
|
||||
|
||||
instruct vmax4F(vecX dst, vecX src1, vecX src2)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 4 && n->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
|
||||
match(Set dst (MaxV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "fmax $dst,$src1,$src2\t# vector (4S)" %}
|
||||
ins_encode %{
|
||||
__ fmax(as_FloatRegister($dst$$reg), __ T4S,
|
||||
as_FloatRegister($src1$$reg),
|
||||
as_FloatRegister($src2$$reg));
|
||||
%}
|
||||
ins_pipe(vdop_fp128);
|
||||
%}
|
||||
|
||||
instruct vmax2D(vecX dst, vecX src1, vecX src2)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2 && n->bottom_type()->is_vect()->element_basic_type() == T_DOUBLE);
|
||||
match(Set dst (MaxV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "fmax $dst,$src1,$src2\t# vector (2D)" %}
|
||||
ins_encode %{
|
||||
__ fmax(as_FloatRegister($dst$$reg), __ T2D,
|
||||
as_FloatRegister($src1$$reg),
|
||||
as_FloatRegister($src2$$reg));
|
||||
%}
|
||||
ins_pipe(vdop_fp128);
|
||||
%}
|
||||
|
||||
instruct vmin2F(vecD dst, vecD src1, vecD src2)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2 && n->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
|
||||
match(Set dst (MinV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "fmin $dst,$src1,$src2\t# vector (2F)" %}
|
||||
ins_encode %{
|
||||
__ fmin(as_FloatRegister($dst$$reg), __ T2S,
|
||||
as_FloatRegister($src1$$reg),
|
||||
as_FloatRegister($src2$$reg));
|
||||
%}
|
||||
ins_pipe(vdop_fp64);
|
||||
%}
|
||||
|
||||
instruct vmin4F(vecX dst, vecX src1, vecX src2)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 4 && n->bottom_type()->is_vect()->element_basic_type() == T_FLOAT);
|
||||
match(Set dst (MinV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "fmin $dst,$src1,$src2\t# vector (4S)" %}
|
||||
ins_encode %{
|
||||
__ fmin(as_FloatRegister($dst$$reg), __ T4S,
|
||||
as_FloatRegister($src1$$reg),
|
||||
as_FloatRegister($src2$$reg));
|
||||
%}
|
||||
ins_pipe(vdop_fp128);
|
||||
%}
|
||||
|
||||
instruct vmin2D(vecX dst, vecX src1, vecX src2)
|
||||
%{
|
||||
predicate(n->as_Vector()->length() == 2 && n->bottom_type()->is_vect()->element_basic_type() == T_DOUBLE);
|
||||
match(Set dst (MinV src1 src2));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "fmin $dst,$src1,$src2\t# vector (2D)" %}
|
||||
ins_encode %{
|
||||
__ fmin(as_FloatRegister($dst$$reg), __ T2D,
|
||||
as_FloatRegister($src1$$reg),
|
||||
as_FloatRegister($src2$$reg));
|
||||
%}
|
||||
ins_pipe(vdop_fp128);
|
||||
%}
|
||||
|
||||
instruct vpopcount4I(vecX dst, vecX src) %{
|
||||
predicate(UsePopCountInstruction && n->as_Vector()->length() == 4);
|
||||
match(Set dst (PopCountVI src));
|
||||
format %{
|
||||
"cnt $dst, $src\t# vector (16B)\n\t"
|
||||
"uaddlp $dst, $dst\t# vector (16B)\n\t"
|
||||
"uaddlp $dst, $dst\t# vector (8H)"
|
||||
%}
|
||||
ins_encode %{
|
||||
__ cnt(as_FloatRegister($dst$$reg), __ T16B,
|
||||
as_FloatRegister($src$$reg));
|
||||
__ uaddlp(as_FloatRegister($dst$$reg), __ T16B,
|
||||
as_FloatRegister($dst$$reg));
|
||||
__ uaddlp(as_FloatRegister($dst$$reg), __ T8H,
|
||||
as_FloatRegister($dst$$reg));
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
instruct vpopcount2I(vecD dst, vecD src) %{
|
||||
predicate(UsePopCountInstruction && n->as_Vector()->length() == 2);
|
||||
match(Set dst (PopCountVI src));
|
||||
format %{
|
||||
"cnt $dst, $src\t# vector (8B)\n\t"
|
||||
"uaddlp $dst, $dst\t# vector (8B)\n\t"
|
||||
"uaddlp $dst, $dst\t# vector (4H)"
|
||||
%}
|
||||
ins_encode %{
|
||||
__ cnt(as_FloatRegister($dst$$reg), __ T8B,
|
||||
as_FloatRegister($src$$reg));
|
||||
__ uaddlp(as_FloatRegister($dst$$reg), __ T8B,
|
||||
as_FloatRegister($dst$$reg));
|
||||
__ uaddlp(as_FloatRegister($dst$$reg), __ T4H,
|
||||
as_FloatRegister($dst$$reg));
|
||||
%}
|
||||
ins_pipe(pipe_class_default);
|
||||
%}
|
||||
|
||||
//----------PEEPHOLE RULES-----------------------------------------------------
|
||||
// These must follow all instruction definitions as they use the names
|
||||
// defined in the instructions definitions.
|
||||
|
||||
@@ -232,44 +232,44 @@ instruct ubfxIConvI2L(iRegLNoSp dst, iRegIorL2I src, immI rshift, immI_bitmask m
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
define(`UBFIZ_INSN', `// We can use ubfiz when masking by a positive number and then left shifting the result.
|
||||
define(`UBFIZ_INSN', `// This pattern is automatically generated from aarch64_ad.m4
|
||||
// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
|
||||
|
||||
// We can use ubfiz when masking by a positive number and then left shifting the result.
|
||||
// We know that the mask is positive because imm$1_bitmask guarantees it.
|
||||
instruct $3$1$8(iReg$2NoSp dst, iReg$1`'ORL2I($1) src, immI lshift, $7 mask)
|
||||
instruct $2$1(iReg$1NoSp dst, iReg$1`'ORL2I($1) src, immI lshift, imm$1_bitmask mask)
|
||||
%{
|
||||
ifelse($8,,
|
||||
match(Set dst (LShift$1 (And$1 src mask) lshift));,
|
||||
match(Set dst ($8 (LShift$1 (And$1 src mask) lshift)));)
|
||||
ifelse($8,,
|
||||
predicate(($6(n->in(1)->in(2)->get_$5() + 1) + (n->in(2)->get_int() & $4)) <= ($4 + 1));,
|
||||
predicate(($6(n->in(1)->in(1)->in(2)->get_$5() + 1) + (n->in(1)->in(2)->get_int() & $4)) <= 31);)
|
||||
match(Set dst (LShift$1 (And$1 src mask) lshift));
|
||||
predicate((exact_log2$5(n->in(1)->in(2)->get_$4() + 1) + (n->in(2)->get_int() & $3)) <= ($3 + 1));
|
||||
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "$3 $dst, $src, $lshift, $mask" %}
|
||||
format %{ "$2 $dst, $src, $lshift, $mask" %}
|
||||
ins_encode %{
|
||||
int lshift = $lshift$$constant & $4;
|
||||
int lshift = $lshift$$constant & $3;
|
||||
intptr_t mask = $mask$$constant;
|
||||
int width = $6(mask+1);
|
||||
__ $3(as_Register($dst$$reg),
|
||||
int width = exact_log2$5(mask+1);
|
||||
__ $2(as_Register($dst$$reg),
|
||||
as_Register($src$$reg), lshift, width);
|
||||
%}
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
')
|
||||
UBFIZ_INSN(I, I, ubfizw, 31, int, exact_log2, immI_bitmask)
|
||||
UBFIZ_INSN(L, L, ubfiz, 63, long, exact_log2_long, immL_bitmask)
|
||||
UBFIZ_INSN(I, L, ubfizw, 31, int, exact_log2, immI_bitmask, ConvI2L)
|
||||
UBFIZ_INSN(L, I, ubfiz, 63, long, exact_log2_long, immL_positive_bitmaskI, ConvL2I)
|
||||
UBFIZ_INSN(I, ubfizw, 31, int)
|
||||
UBFIZ_INSN(L, ubfiz, 63, long, _long)
|
||||
|
||||
define(`BFX1_INSN', `// If there is a convert $1 to $2 block between and And$1 and a LShift$2, we can also match ubfiz
|
||||
instruct ubfiz$1Conv$3$9(iReg$2NoSp dst, iReg$1`'ORL2I($1) src, immI lshift, $8 mask)
|
||||
// This pattern is automatically generated from aarch64_ad.m4
|
||||
// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
|
||||
|
||||
// If there is a convert I to L block between and AndI and a LShiftL, we can also match ubfiz
|
||||
instruct ubfizIConvI2L(iRegLNoSp dst, iRegIorL2I src, immI lshift, immI_bitmask mask)
|
||||
%{
|
||||
match(Set dst (LShift$2 (Conv$3 (And$1 src mask)) lshift));
|
||||
predicate(($4(n->in(1)->in(1)->in(2)->$5() + 1) + (n->in(2)->get_int() & $6)) <= $7);
|
||||
match(Set dst (LShiftL (ConvI2L (AndI src mask)) lshift));
|
||||
predicate((exact_log2(n->in(1)->in(1)->in(2)->get_int() + 1) + (n->in(2)->get_int() & 63)) <= (63 + 1));
|
||||
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "ubfiz $dst, $src, $lshift, $mask" %}
|
||||
ins_encode %{
|
||||
int lshift = $lshift$$constant & $6;
|
||||
int lshift = $lshift$$constant & 63;
|
||||
intptr_t mask = $mask$$constant;
|
||||
int width = exact_log2(mask+1);
|
||||
__ ubfiz(as_Register($dst$$reg),
|
||||
@@ -277,20 +277,7 @@ instruct ubfiz$1Conv$3$9(iReg$2NoSp dst, iReg$1`'ORL2I($1) src, immI lshift, $8
|
||||
%}
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
')dnl
|
||||
BFX1_INSN(I, L, I2L, exact_log2, get_int, 63, (63 + 1), immI_bitmask)
|
||||
BFX1_INSN(L, I, L2I, exact_log2_long, get_long, 31, 31, immL_positive_bitmaskI, x)
|
||||
// Can skip int2long conversions after AND with small bitmask
|
||||
instruct ubfizIConvI2LAndI(iRegLNoSp dst, iRegI src, immI_bitmask msk)
|
||||
%{
|
||||
match(Set dst (ConvI2L (AndI src msk)));
|
||||
ins_cost(INSN_COST);
|
||||
format %{ "ubfiz $dst, $src, 0, exact_log2($msk + 1) " %}
|
||||
ins_encode %{
|
||||
__ ubfiz(as_Register($dst$$reg), as_Register($src$$reg), 0, exact_log2($msk$$constant + 1));
|
||||
%}
|
||||
ins_pipe(ialu_reg_shift);
|
||||
%}
|
||||
|
||||
|
||||
// Rotations dnl
|
||||
define(`EXTRACT_INSN',`
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2020, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2017, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@@ -135,20 +135,7 @@ void AbstractInterpreter::layout_activation(Method* method,
|
||||
// interpreter_frame_sender_sp interpreter_frame_sender_sp is
|
||||
// the original sp of the caller (the unextended_sp) and
|
||||
// sender_sp is fp+8/16 (32bit/64bit) XXX
|
||||
//
|
||||
// The interpreted method entry on AArch64 aligns SP to 16 bytes
|
||||
// before generating the fixed part of the activation frame. So there
|
||||
// may be a gap between the locals block and the saved sender SP. For
|
||||
// an interpreted caller we need to recreate this gap and exactly
|
||||
// align the incoming parameters with the caller's temporary
|
||||
// expression stack. For other types of caller frame it doesn't
|
||||
// matter.
|
||||
intptr_t* locals;
|
||||
if (caller->is_interpreted_frame()) {
|
||||
locals = caller->interpreter_frame_last_sp() + caller_actual_parameters - 1;
|
||||
} else {
|
||||
locals = interpreter_frame->sender_sp() + max_locals - 1;
|
||||
}
|
||||
intptr_t* locals = interpreter_frame->sender_sp() + max_locals - 1;
|
||||
|
||||
#ifdef ASSERT
|
||||
if (caller->is_interpreted_frame()) {
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -319,12 +319,10 @@ public:
|
||||
};
|
||||
class Post : public PrePost {
|
||||
Register _idx;
|
||||
bool _is_postreg;
|
||||
public:
|
||||
Post(Register reg, int o) : PrePost(reg, o) { _idx = NULL; _is_postreg = false; }
|
||||
Post(Register reg, Register idx) : PrePost(reg, 0) { _idx = idx; _is_postreg = true; }
|
||||
Post(Register reg, int o) : PrePost(reg, o) { _idx = NULL; }
|
||||
Post(Register reg, Register idx) : PrePost(reg, 0) { _idx = idx; }
|
||||
Register idx_reg() { return _idx; }
|
||||
bool is_postreg() {return _is_postreg; }
|
||||
};
|
||||
|
||||
namespace ext
|
||||
@@ -414,7 +412,7 @@ class Address {
|
||||
: _base(p.reg()), _offset(p.offset()), _mode(pre) { }
|
||||
Address(Post p)
|
||||
: _base(p.reg()), _index(p.idx_reg()), _offset(p.offset()),
|
||||
_mode(p.is_postreg() ? post_reg : post), _target(0) { }
|
||||
_mode(p.idx_reg() == NULL ? post : post_reg), _target(0) { }
|
||||
Address(address target, RelocationHolder const& rspec)
|
||||
: _mode(literal),
|
||||
_rspec(rspec),
|
||||
@@ -615,9 +613,7 @@ class InternalAddress: public Address {
|
||||
InternalAddress(address target) : Address(target, relocInfo::internal_word_type) {}
|
||||
};
|
||||
|
||||
const int FPUStateSizeInWords = FloatRegisterImpl::number_of_registers *
|
||||
FloatRegisterImpl::save_slots_per_register;
|
||||
|
||||
const int FPUStateSizeInWords = 32 * 2;
|
||||
typedef enum {
|
||||
PLDL1KEEP = 0b00000, PLDL1STRM, PLDL2KEEP, PLDL2STRM, PLDL3KEEP, PLDL3STRM,
|
||||
PSTL1KEEP = 0b10000, PSTL1STRM, PSTL2KEEP, PSTL2STRM, PSTL3KEEP, PSTL3STRM,
|
||||
@@ -816,34 +812,32 @@ public:
|
||||
#undef INSN
|
||||
|
||||
// Bitfield
|
||||
#define INSN(NAME, opcode, size) \
|
||||
#define INSN(NAME, opcode) \
|
||||
void NAME(Register Rd, Register Rn, unsigned immr, unsigned imms) { \
|
||||
starti; \
|
||||
guarantee(size == 1 || (immr < 32 && imms < 32), "incorrect immr/imms");\
|
||||
f(opcode, 31, 22), f(immr, 21, 16), f(imms, 15, 10); \
|
||||
zrf(Rn, 5), rf(Rd, 0); \
|
||||
}
|
||||
|
||||
INSN(sbfmw, 0b0001001100, 0);
|
||||
INSN(bfmw, 0b0011001100, 0);
|
||||
INSN(ubfmw, 0b0101001100, 0);
|
||||
INSN(sbfm, 0b1001001101, 1);
|
||||
INSN(bfm, 0b1011001101, 1);
|
||||
INSN(ubfm, 0b1101001101, 1);
|
||||
INSN(sbfmw, 0b0001001100);
|
||||
INSN(bfmw, 0b0011001100);
|
||||
INSN(ubfmw, 0b0101001100);
|
||||
INSN(sbfm, 0b1001001101);
|
||||
INSN(bfm, 0b1011001101);
|
||||
INSN(ubfm, 0b1101001101);
|
||||
|
||||
#undef INSN
|
||||
|
||||
// Extract
|
||||
#define INSN(NAME, opcode, size) \
|
||||
#define INSN(NAME, opcode) \
|
||||
void NAME(Register Rd, Register Rn, Register Rm, unsigned imms) { \
|
||||
starti; \
|
||||
guarantee(size == 1 || imms < 32, "incorrect imms"); \
|
||||
f(opcode, 31, 21), f(imms, 15, 10); \
|
||||
zrf(Rm, 16), zrf(Rn, 5), zrf(Rd, 0); \
|
||||
rf(Rm, 16), rf(Rn, 5), rf(Rd, 0); \
|
||||
}
|
||||
|
||||
INSN(extrw, 0b00010011100, 0);
|
||||
INSN(extr, 0b10010011110, 1);
|
||||
INSN(extrw, 0b00010011100);
|
||||
INSN(extr, 0b10010011110);
|
||||
|
||||
#undef INSN
|
||||
|
||||
@@ -1137,7 +1131,7 @@ public:
|
||||
Register Rn, enum operand_size sz, int op, bool ordered) {
|
||||
starti;
|
||||
f(sz, 31, 30), f(0b001000, 29, 24), f(op, 23, 21);
|
||||
rf(Rs, 16), f(ordered, 15), zrf(Rt2, 10), srf(Rn, 5), zrf(Rt1, 0);
|
||||
rf(Rs, 16), f(ordered, 15), rf(Rt2, 10), srf(Rn, 5), zrf(Rt1, 0);
|
||||
}
|
||||
|
||||
void load_exclusive(Register dst, Register addr,
|
||||
@@ -1266,7 +1260,7 @@ public:
|
||||
enum operand_size sz, int op1, int op2, bool a, bool r) {
|
||||
starti;
|
||||
f(sz, 31, 30), f(0b111000, 29, 24), f(a, 23), f(r, 22), f(1, 21);
|
||||
zrf(Rs, 16), f(op1, 15), f(op2, 14, 12), f(0, 11, 10), srf(Rn, 5), zrf(Rt, 0);
|
||||
rf(Rs, 16), f(op1, 15), f(op2, 14, 12), f(0, 11, 10), rf(Rn, 5), zrf(Rt, 0);
|
||||
}
|
||||
|
||||
#define INSN(NAME, NAME_A, NAME_L, NAME_AL, op1, op2) \
|
||||
@@ -1488,7 +1482,6 @@ public:
|
||||
void NAME(Register Rd, Register Rn, Register Rm, \
|
||||
enum shift_kind kind = LSL, unsigned shift = 0) { \
|
||||
starti; \
|
||||
guarantee(size == 1 || shift < 32, "incorrect shift"); \
|
||||
f(N, 21); \
|
||||
zrf(Rm, 16), zrf(Rn, 5), zrf(Rd, 0); \
|
||||
op_shifted_reg(0b01010, kind, shift, size, op); \
|
||||
@@ -1556,7 +1549,6 @@ void mvnw(Register Rd, Register Rm,
|
||||
starti; \
|
||||
f(0, 21); \
|
||||
assert_cond(kind != ROR); \
|
||||
guarantee(size == 1 || shift < 32, "incorrect shift");\
|
||||
zrf(Rd, 0), zrf(Rn, 5), zrf(Rm, 16); \
|
||||
op_shifted_reg(0b01011, kind, shift, size, op); \
|
||||
}
|
||||
@@ -1585,7 +1577,7 @@ void mvnw(Register Rd, Register Rm,
|
||||
void add_sub_extended_reg(unsigned op, unsigned decode,
|
||||
Register Rd, Register Rn, Register Rm,
|
||||
unsigned opt, ext::operation option, unsigned imm) {
|
||||
guarantee(imm <= 4, "shift amount must be <= 4");
|
||||
guarantee(imm <= 4, "shift amount must be < 4");
|
||||
f(op, 31, 29), f(decode, 28, 24), f(opt, 23, 22), f(1, 21);
|
||||
f(option, 15, 13), f(imm, 12, 10);
|
||||
}
|
||||
@@ -1670,7 +1662,7 @@ void mvnw(Register Rd, Register Rm,
|
||||
f(o2, 10);
|
||||
f(o3, 4);
|
||||
f(nzcv, 3, 0);
|
||||
f(imm5, 20, 16), zrf(Rn, 5);
|
||||
f(imm5, 20, 16), rf(Rn, 5);
|
||||
}
|
||||
|
||||
#define INSN(NAME, op) \
|
||||
@@ -2023,21 +2015,6 @@ public:
|
||||
#undef INSN
|
||||
#undef INSN1
|
||||
|
||||
// Floating-point compare. 3-registers versions (scalar).
|
||||
#define INSN(NAME, sz, e) \
|
||||
void NAME(FloatRegister Vd, FloatRegister Vn, FloatRegister Vm) { \
|
||||
starti; \
|
||||
f(0b01111110, 31, 24), f(e, 23), f(sz, 22), f(1, 21), rf(Vm, 16); \
|
||||
f(0b111011, 15, 10), rf(Vn, 5), rf(Vd, 0); \
|
||||
} \
|
||||
|
||||
INSN(facged, 1, 0); // facge-double
|
||||
INSN(facges, 0, 0); // facge-single
|
||||
INSN(facgtd, 1, 1); // facgt-double
|
||||
INSN(facgts, 0, 1); // facgt-single
|
||||
|
||||
#undef INSN
|
||||
|
||||
// Floating-point Move (immediate)
|
||||
private:
|
||||
unsigned pack(double value);
|
||||
@@ -2154,12 +2131,7 @@ public:
|
||||
}
|
||||
void ld_st(FloatRegister Vt, SIMD_Arrangement T, Register Xn,
|
||||
int imm, int op1, int op2, int regs) {
|
||||
|
||||
bool replicate = op2 >> 2 == 3;
|
||||
// post-index value (imm) is formed differently for replicate/non-replicate ld* instructions
|
||||
int expectedImmediate = replicate ? regs * (1 << (T >> 1)) : SIMD_Size_in_bytes[T] * regs;
|
||||
guarantee(T < T1Q , "incorrect arrangement");
|
||||
guarantee(imm == expectedImmediate, "bad offset");
|
||||
guarantee(T <= T1Q && imm == SIMD_Size_in_bytes[T] * regs, "bad offset");
|
||||
starti;
|
||||
f(0,31), f((int)T & 1, 30);
|
||||
f(op1 | 0b100, 29, 21), f(0b11111, 20, 16), f(op2, 15, 12);
|
||||
@@ -2266,62 +2238,39 @@ public:
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, opc, opc2, acceptT2D) \
|
||||
#define INSN(NAME, opc, opc2) \
|
||||
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
|
||||
guarantee(T != T1Q && T != T1D, "incorrect arrangement"); \
|
||||
if (!acceptT2D) guarantee(T != T2D, "incorrect arrangement"); \
|
||||
starti; \
|
||||
f(0, 31), f((int)T & 1, 30), f(opc, 29), f(0b01110, 28, 24); \
|
||||
f((int)T >> 1, 23, 22), f(1, 21), rf(Vm, 16), f(opc2, 15, 10); \
|
||||
rf(Vn, 5), rf(Vd, 0); \
|
||||
}
|
||||
|
||||
INSN(addv, 0, 0b100001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(subv, 1, 0b100001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(mulv, 0, 0b100111, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(mlav, 0, 0b100101, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(mlsv, 1, 0b100101, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(sshl, 0, 0b010001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(ushl, 1, 0b010001, true); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(umullv, 1, 0b110000, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(umlalv, 1, 0b100000, false); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(addv, 0, 0b100001);
|
||||
INSN(subv, 1, 0b100001);
|
||||
INSN(mulv, 0, 0b100111);
|
||||
INSN(mlav, 0, 0b100101);
|
||||
INSN(mlsv, 1, 0b100101);
|
||||
INSN(sshl, 0, 0b010001);
|
||||
INSN(ushl, 1, 0b010001);
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, opc, opc2, accepted) \
|
||||
#define INSN(NAME, opc, opc2) \
|
||||
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) { \
|
||||
guarantee(T != T1Q && T != T1D, "incorrect arrangement"); \
|
||||
if (accepted < 3) guarantee(T != T2D, "incorrect arrangement"); \
|
||||
if (accepted < 2) guarantee(T != T2S, "incorrect arrangement"); \
|
||||
if (accepted < 1) guarantee(T == T8B || T == T16B, "incorrect arrangement"); \
|
||||
starti; \
|
||||
f(0, 31), f((int)T & 1, 30), f(opc, 29), f(0b01110, 28, 24); \
|
||||
f((int)T >> 1, 23, 22), f(opc2, 21, 10); \
|
||||
rf(Vn, 5), rf(Vd, 0); \
|
||||
}
|
||||
|
||||
INSN(absr, 0, 0b100000101110, 3); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(negr, 1, 0b100000101110, 3); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S, T2D
|
||||
INSN(notr, 1, 0b100000010110, 0); // accepted arrangements: T8B, T16B
|
||||
INSN(addv, 0, 0b110001101110, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||
INSN(cls, 0, 0b100000010010, 2); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(clz, 1, 0b100000010010, 2); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(cnt, 0, 0b100000010110, 0); // accepted arrangements: T8B, T16B
|
||||
INSN(uaddlp, 1, 0b100000001010, 2); // accepted arrangements: T8B, T16B, T4H, T8H, T2S, T4S
|
||||
INSN(uaddlv, 1, 0b110000001110, 1); // accepted arrangements: T8B, T16B, T4H, T8H, T4S
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, opc) \
|
||||
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn) { \
|
||||
starti; \
|
||||
assert(T == T4S, "arrangement must be T4S"); \
|
||||
f(0, 31), f((int)T & 1, 30), f(0b101110, 29, 24), f(opc, 23), \
|
||||
f(T == T4S ? 0 : 1, 22), f(0b110000111110, 21, 10); rf(Vn, 5), rf(Vd, 0); \
|
||||
}
|
||||
|
||||
INSN(fmaxv, 0);
|
||||
INSN(fminv, 1);
|
||||
INSN(absr, 0, 0b100000101110);
|
||||
INSN(negr, 1, 0b100000101110);
|
||||
INSN(notr, 1, 0b100000010110);
|
||||
INSN(addv, 0, 0b110001101110);
|
||||
INSN(cls, 0, 0b100000010010);
|
||||
INSN(clz, 1, 0b100000010010);
|
||||
INSN(cnt, 0, 0b100000010110);
|
||||
|
||||
#undef INSN
|
||||
|
||||
@@ -2332,7 +2281,7 @@ public:
|
||||
starti; \
|
||||
assert(lsl == 0 || \
|
||||
((T == T4H || T == T8H) && lsl == 8) || \
|
||||
((T == T2S || T == T4S) && ((lsl >> 3) < 4) && ((lsl & 7) == 0)), "invalid shift");\
|
||||
((T == T2S || T == T4S) && ((lsl >> 3) < 4)), "invalid shift"); \
|
||||
cmode |= lsl >> 2; \
|
||||
if (T == T4H || T == T8H) cmode |= 0b1000; \
|
||||
if (!(T == T4H || T == T8H || T == T2S || T == T4S)) { \
|
||||
@@ -2366,8 +2315,6 @@ public:
|
||||
INSN(fsub, 0, 1, 0b110101);
|
||||
INSN(fmla, 0, 0, 0b110011);
|
||||
INSN(fmls, 0, 1, 0b110011);
|
||||
INSN(fmax, 0, 0, 0b111101);
|
||||
INSN(fmin, 0, 1, 0b111101);
|
||||
|
||||
#undef INSN
|
||||
|
||||
@@ -2493,22 +2440,7 @@ public:
|
||||
|
||||
#undef INSN
|
||||
|
||||
#define INSN(NAME, opc, opc2, isSHR) \
|
||||
void NAME(FloatRegister Vd, FloatRegister Vn, int shift){ \
|
||||
starti; \
|
||||
int encodedShift = isSHR ? 128 - shift : 64 + shift; \
|
||||
f(0b01, 31, 30), f(opc, 29), f(0b111110, 28, 23), \
|
||||
f(encodedShift, 22, 16); f(opc2, 15, 10), rf(Vn, 5), rf(Vd, 0); \
|
||||
}
|
||||
|
||||
INSN(shld, 0, 0b010101, /* isSHR = */ false);
|
||||
INSN(sshrd, 0, 0b000001, /* isSHR = */ true);
|
||||
INSN(ushrd, 1, 0b000001, /* isSHR = */ true);
|
||||
|
||||
#undef INSN
|
||||
|
||||
private:
|
||||
void _ushll(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
|
||||
void ushll(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
|
||||
starti;
|
||||
/* The encodings for the immh:immb fields (bits 22:16) are
|
||||
* 0001 xxx 8H, 8B/16b shift = xxx
|
||||
@@ -2521,16 +2453,8 @@ private:
|
||||
f(0, 31), f(Tb & 1, 30), f(0b1011110, 29, 23), f((1 << ((Tb>>1)+3))|shift, 22, 16);
|
||||
f(0b101001, 15, 10), rf(Vn, 5), rf(Vd, 0);
|
||||
}
|
||||
|
||||
public:
|
||||
void ushll(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
|
||||
assert(Tb == T8B || Tb == T4H || Tb == T2S, "invalid arrangement");
|
||||
_ushll(Vd, Ta, Vn, Tb, shift);
|
||||
}
|
||||
|
||||
void ushll2(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, SIMD_Arrangement Tb, int shift) {
|
||||
assert(Tb == T16B || Tb == T8H || Tb == T4S, "invalid arrangement");
|
||||
_ushll(Vd, Ta, Vn, Tb, shift);
|
||||
ushll(Vd, Ta, Vn, Tb, shift);
|
||||
}
|
||||
|
||||
// Move from general purpose register
|
||||
@@ -2538,21 +2462,19 @@ public:
|
||||
void mov(FloatRegister Vd, SIMD_Arrangement T, int index, Register Xn) {
|
||||
starti;
|
||||
f(0b01001110000, 31, 21), f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
|
||||
f(0b000111, 15, 10), zrf(Xn, 5), rf(Vd, 0);
|
||||
f(0b000111, 15, 10), rf(Xn, 5), rf(Vd, 0);
|
||||
}
|
||||
|
||||
// Move to general purpose register
|
||||
// mov Rd, Vn.T[index]
|
||||
void mov(Register Xd, FloatRegister Vn, SIMD_Arrangement T, int index) {
|
||||
guarantee(T >= T2S && T < T1Q, "only D and S arrangements are supported");
|
||||
starti;
|
||||
f(0, 31), f((T >= T1D) ? 1:0, 30), f(0b001110000, 29, 21);
|
||||
f(((1 << (T >> 1)) | (index << ((T >> 1) + 1))), 20, 16);
|
||||
f(0b001111, 15, 10), rf(Vn, 5), rf(Xd, 0);
|
||||
}
|
||||
|
||||
private:
|
||||
void _pmull(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
|
||||
void pmull(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
|
||||
starti;
|
||||
assert((Ta == T1Q && (Tb == T1D || Tb == T2D)) ||
|
||||
(Ta == T8H && (Tb == T8B || Tb == T16B)), "Invalid Size specifier");
|
||||
@@ -2560,16 +2482,9 @@ private:
|
||||
f(0, 31), f(Tb & 1, 30), f(0b001110, 29, 24), f(size, 23, 22);
|
||||
f(1, 21), rf(Vm, 16), f(0b111000, 15, 10), rf(Vn, 5), rf(Vd, 0);
|
||||
}
|
||||
|
||||
public:
|
||||
void pmull(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
|
||||
assert(Tb == T1D || Tb == T8B, "pmull assumes T1D or T8B as the second size specifier");
|
||||
_pmull(Vd, Ta, Vn, Vm, Tb);
|
||||
}
|
||||
|
||||
void pmull2(FloatRegister Vd, SIMD_Arrangement Ta, FloatRegister Vn, FloatRegister Vm, SIMD_Arrangement Tb) {
|
||||
assert(Tb == T2D || Tb == T16B, "pmull2 assumes T2D or T16B as the second size specifier");
|
||||
_pmull(Vd, Ta, Vn, Vm, Tb);
|
||||
pmull(Vd, Ta, Vn, Vm, Tb);
|
||||
}
|
||||
|
||||
void uqxtn(FloatRegister Vd, SIMD_Arrangement Tb, FloatRegister Vn, SIMD_Arrangement Ta) {
|
||||
@@ -2586,7 +2501,7 @@ public:
|
||||
starti;
|
||||
assert(T != T1D, "reserved encoding");
|
||||
f(0,31), f((int)T & 1, 30), f(0b001110000, 29, 21);
|
||||
f((1 << (T >> 1)), 20, 16), f(0b000011, 15, 10), zrf(Xs, 5), rf(Vd, 0);
|
||||
f((1 << (T >> 1)), 20, 16), f(0b000011, 15, 10), rf(Xs, 5), rf(Vd, 0);
|
||||
}
|
||||
|
||||
void dup(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, int index = 0)
|
||||
@@ -2601,7 +2516,6 @@ public:
|
||||
// AdvSIMD ZIP/UZP/TRN
|
||||
#define INSN(NAME, opcode) \
|
||||
void NAME(FloatRegister Vd, SIMD_Arrangement T, FloatRegister Vn, FloatRegister Vm) { \
|
||||
guarantee(T != T1D && T != T1Q, "invalid arrangement"); \
|
||||
starti; \
|
||||
f(0, 31), f(0b001110, 29, 24), f(0, 21), f(0, 15); \
|
||||
f(opcode, 14, 12), f(0b10, 11, 10); \
|
||||
|
||||
@@ -1,49 +0,0 @@
|
||||
/* Copyright (c) 2021, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 only, as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
* version 2 for more details (a copy is included in the LICENSE file that
|
||||
* accompanied this code).
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License version
|
||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
*
|
||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||
* or visit www.oracle.com if you need additional information or have any
|
||||
* questions.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef CPU_AARCH64_ATOMIC_AARCH64_HPP
|
||||
#define CPU_AARCH64_ATOMIC_AARCH64_HPP
|
||||
|
||||
// Atomic stub implementation.
|
||||
// Default implementations are in atomic_linux_aarch64.S
|
||||
//
|
||||
// All stubs pass arguments the same way
|
||||
// x0: src/dest address
|
||||
// x1: arg1
|
||||
// x2: arg2 (optional)
|
||||
// x3, x8, x9: scratch
|
||||
typedef uint64_t (*aarch64_atomic_stub_t)(volatile void *ptr, uint64_t arg1, uint64_t arg2);
|
||||
|
||||
// Pointers to stubs
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_fetch_add_4_impl;
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_fetch_add_8_impl;
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_xchg_4_impl;
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_xchg_8_impl;
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_cmpxchg_1_impl;
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_cmpxchg_4_impl;
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_cmpxchg_8_impl;
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_cmpxchg_1_relaxed_impl;
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_cmpxchg_4_relaxed_impl;
|
||||
extern aarch64_atomic_stub_t aarch64_atomic_cmpxchg_8_relaxed_impl;
|
||||
|
||||
#endif // CPU_AARCH64_ATOMIC_AARCH64_HPP
|
||||
@@ -173,10 +173,10 @@ LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
|
||||
if (large_disp != 0) {
|
||||
LIR_Opr tmp = new_pointer_register();
|
||||
if (Assembler::operand_valid_for_add_sub_immediate(large_disp)) {
|
||||
__ add(index, LIR_OprFact::intptrConst(large_disp), tmp);
|
||||
__ add(tmp, tmp, LIR_OprFact::intptrConst(large_disp));
|
||||
index = tmp;
|
||||
} else {
|
||||
__ move(LIR_OprFact::intptrConst(large_disp), tmp);
|
||||
__ move(tmp, LIR_OprFact::intptrConst(large_disp));
|
||||
__ add(tmp, index, tmp);
|
||||
index = tmp;
|
||||
}
|
||||
@@ -190,7 +190,7 @@ LIR_Address* LIRGenerator::generate_address(LIR_Opr base, LIR_Opr index,
|
||||
}
|
||||
|
||||
// at this point we either have base + index or base + displacement
|
||||
if (large_disp == 0 && index->is_register()) {
|
||||
if (large_disp == 0) {
|
||||
return new LIR_Address(base, index, type);
|
||||
} else {
|
||||
assert(Address::offset_ok_for_immed(large_disp, 0), "must be");
|
||||
|
||||
@@ -143,7 +143,7 @@ int StubAssembler::call_RT(Register oop_result1, Register metadata_result, addre
|
||||
if (arg1 == c_rarg2 || arg1 == c_rarg3 ||
|
||||
arg2 == c_rarg1 || arg2 == c_rarg3 ||
|
||||
arg3 == c_rarg1 || arg3 == c_rarg2) {
|
||||
stp(arg3, arg2, Address(pre(sp, -2 * wordSize)));
|
||||
stp(arg3, arg2, Address(pre(sp, 2 * wordSize)));
|
||||
stp(arg1, zr, Address(pre(sp, -2 * wordSize)));
|
||||
ldp(c_rarg1, zr, Address(post(sp, 2 * wordSize)));
|
||||
ldp(c_rarg3, c_rarg2, Address(post(sp, 2 * wordSize)));
|
||||
|
||||
@@ -46,7 +46,7 @@ define_pd_global(intx, CompileThreshold, 10000);
|
||||
|
||||
define_pd_global(intx, OnStackReplacePercentage, 140);
|
||||
define_pd_global(intx, ConditionalMoveLimit, 3);
|
||||
define_pd_global(intx, FLOATPRESSURE, 32);
|
||||
define_pd_global(intx, FLOATPRESSURE, 64);
|
||||
define_pd_global(intx, FreqInlineSize, 325);
|
||||
define_pd_global(intx, MinJumpTableSize, 10);
|
||||
define_pd_global(intx, INTPRESSURE, 24);
|
||||
@@ -76,7 +76,7 @@ define_pd_global(intx, ReservedCodeCacheSize, 48*M);
|
||||
define_pd_global(intx, NonProfiledCodeHeapSize, 21*M);
|
||||
define_pd_global(intx, ProfiledCodeHeapSize, 22*M);
|
||||
define_pd_global(intx, NonNMethodCodeHeapSize, 5*M );
|
||||
define_pd_global(uintx, CodeCacheMinBlockLength, 6);
|
||||
define_pd_global(uintx, CodeCacheMinBlockLength, 4);
|
||||
define_pd_global(uintx, CodeCacheMinimumUseSpace, 400*K);
|
||||
|
||||
// Heap related flags
|
||||
|
||||
@@ -36,9 +36,6 @@
|
||||
|
||||
#define __ _masm.
|
||||
address CompiledStaticCall::emit_to_interp_stub(CodeBuffer &cbuf, address mark) {
|
||||
precond(cbuf.stubs()->start() != badAddress);
|
||||
precond(cbuf.stubs()->end() != badAddress);
|
||||
|
||||
// Stub is fixed up when the corresponding call is converted from
|
||||
// calling compiled code to calling interpreted code.
|
||||
// mov rmethod, 0
|
||||
|
||||
@@ -539,7 +539,7 @@ bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
|
||||
Method* m = *interpreter_frame_method_addr();
|
||||
|
||||
// validate the method we'd find in this potential sender
|
||||
if (!Method::is_valid_method(m)) return false;
|
||||
if (!m->is_valid_method()) return false;
|
||||
|
||||
// stack frames shouldn't be much larger than max_stack elements
|
||||
// this test requires the use of unextended_sp which is the sp as seen by
|
||||
|
||||
@@ -61,7 +61,6 @@
|
||||
// [last sp ]
|
||||
// [oop temp ] (only for native calls)
|
||||
|
||||
// [padding ] (to preserve machine SP alignment)
|
||||
// [locals and parameters ]
|
||||
// <- sender sp
|
||||
// ------------------------------ Asm interpreter ----------------------------------------
|
||||
|
||||
@@ -53,7 +53,7 @@ const bool CCallingConventionRequiresIntsAsLongs = false;
|
||||
|
||||
#define THREAD_LOCAL_POLL
|
||||
|
||||
#if defined(__APPLE__) || defined(_WIN64)
|
||||
#if defined(_WIN64)
|
||||
#define R18_RESERVED
|
||||
#define R18_RESERVED_ONLY(code) code
|
||||
#define NOT_R18_RESERVED(code)
|
||||
|
||||
@@ -700,11 +700,6 @@ void MacroAssembler::call_VM_base(Register oop_result,
|
||||
// do the call, remove parameters
|
||||
MacroAssembler::call_VM_leaf_base(entry_point, number_of_arguments, &l);
|
||||
|
||||
// lr could be poisoned with PAC signature during throw_pending_exception
|
||||
// if it was tail-call optimized by compiler, since lr is not callee-saved
|
||||
// reload it with proper value
|
||||
adr(lr, l);
|
||||
|
||||
// reset last Java frame
|
||||
// Only interpreter should have to clear fp
|
||||
reset_last_Java_frame(true);
|
||||
@@ -757,7 +752,6 @@ address MacroAssembler::trampoline_call(Address entry, CodeBuffer *cbuf) {
|
||||
if (!in_scratch_emit_size) {
|
||||
address stub = emit_trampoline_stub(offset(), entry.target());
|
||||
if (stub == NULL) {
|
||||
postcond(pc() == badAddress);
|
||||
return NULL; // CodeCache is full
|
||||
}
|
||||
}
|
||||
@@ -771,7 +765,6 @@ address MacroAssembler::trampoline_call(Address entry, CodeBuffer *cbuf) {
|
||||
bl(pc());
|
||||
}
|
||||
// just need to return a non-null address
|
||||
postcond(pc() != badAddress);
|
||||
return pc();
|
||||
}
|
||||
|
||||
@@ -1031,22 +1024,27 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
|
||||
// }
|
||||
Label search, found_method;
|
||||
|
||||
ldr(method_result, Address(scan_temp, itableOffsetEntry::interface_offset_in_bytes()));
|
||||
cmp(intf_klass, method_result);
|
||||
br(Assembler::EQ, found_method);
|
||||
bind(search);
|
||||
// Check that the previous entry is non-null. A null entry means that
|
||||
// the receiver class doesn't implement the interface, and wasn't the
|
||||
// same as when the caller was compiled.
|
||||
cbz(method_result, L_no_such_interface);
|
||||
if (itableOffsetEntry::interface_offset_in_bytes() != 0) {
|
||||
add(scan_temp, scan_temp, scan_step);
|
||||
for (int peel = 1; peel >= 0; peel--) {
|
||||
ldr(method_result, Address(scan_temp, itableOffsetEntry::interface_offset_in_bytes()));
|
||||
} else {
|
||||
ldr(method_result, Address(pre(scan_temp, scan_step)));
|
||||
cmp(intf_klass, method_result);
|
||||
|
||||
if (peel) {
|
||||
br(Assembler::EQ, found_method);
|
||||
} else {
|
||||
br(Assembler::NE, search);
|
||||
// (invert the test to fall through to found_method...)
|
||||
}
|
||||
|
||||
if (!peel) break;
|
||||
|
||||
bind(search);
|
||||
|
||||
// Check that the previous entry is non-null. A null entry means that
|
||||
// the receiver class doesn't implement the interface, and wasn't the
|
||||
// same as when the caller was compiled.
|
||||
cbz(method_result, L_no_such_interface);
|
||||
add(scan_temp, scan_temp, scan_step);
|
||||
}
|
||||
cmp(intf_klass, method_result);
|
||||
br(Assembler::NE, search);
|
||||
|
||||
bind(found_method);
|
||||
|
||||
@@ -2470,8 +2468,6 @@ void MacroAssembler::atomic_##OP(Register prev, Register newv, Register addr) {
|
||||
|
||||
ATOMIC_XCHG(xchg, swp, ldxr, stxr, Assembler::xword)
|
||||
ATOMIC_XCHG(xchgw, swp, ldxrw, stxrw, Assembler::word)
|
||||
ATOMIC_XCHG(xchgl, swpl, ldxr, stlxr, Assembler::xword)
|
||||
ATOMIC_XCHG(xchglw, swpl, ldxrw, stlxrw, Assembler::word)
|
||||
ATOMIC_XCHG(xchgal, swpal, ldaxr, stlxr, Assembler::xword)
|
||||
ATOMIC_XCHG(xchgalw, swpal, ldaxrw, stlxrw, Assembler::word)
|
||||
|
||||
@@ -5028,7 +5024,7 @@ void MacroAssembler::string_compare(Register str1, Register str2,
|
||||
#endif // COMPILER2
|
||||
|
||||
// This method checks if provided byte array contains byte with highest bit set.
|
||||
address MacroAssembler::has_negatives(Register ary1, Register len, Register result) {
|
||||
void MacroAssembler::has_negatives(Register ary1, Register len, Register result) {
|
||||
// Simple and most common case of aligned small array which is not at the
|
||||
// end of memory page is placed here. All other cases are in stub.
|
||||
Label LOOP, END, STUB, STUB_LONG, SET_RESULT, DONE;
|
||||
@@ -5065,38 +5061,27 @@ address MacroAssembler::has_negatives(Register ary1, Register len, Register resu
|
||||
b(SET_RESULT);
|
||||
|
||||
BIND(STUB);
|
||||
RuntimeAddress has_neg = RuntimeAddress(StubRoutines::aarch64::has_negatives());
|
||||
RuntimeAddress has_neg = RuntimeAddress(StubRoutines::aarch64::has_negatives());
|
||||
assert(has_neg.target() != NULL, "has_negatives stub has not been generated");
|
||||
address tpc1 = trampoline_call(has_neg);
|
||||
if (tpc1 == NULL) {
|
||||
DEBUG_ONLY(reset_labels3(STUB_LONG, SET_RESULT, DONE));
|
||||
postcond(pc() == badAddress);
|
||||
return NULL;
|
||||
}
|
||||
trampoline_call(has_neg);
|
||||
b(DONE);
|
||||
|
||||
BIND(STUB_LONG);
|
||||
RuntimeAddress has_neg_long = RuntimeAddress(StubRoutines::aarch64::has_negatives_long());
|
||||
RuntimeAddress has_neg_long = RuntimeAddress(
|
||||
StubRoutines::aarch64::has_negatives_long());
|
||||
assert(has_neg_long.target() != NULL, "has_negatives stub has not been generated");
|
||||
address tpc2 = trampoline_call(has_neg_long);
|
||||
if (tpc2 == NULL) {
|
||||
DEBUG_ONLY(reset_labels2(SET_RESULT, DONE));
|
||||
postcond(pc() == badAddress);
|
||||
return NULL;
|
||||
}
|
||||
trampoline_call(has_neg_long);
|
||||
b(DONE);
|
||||
|
||||
BIND(SET_RESULT);
|
||||
cset(result, NE); // set true or false
|
||||
|
||||
BIND(DONE);
|
||||
postcond(pc() != badAddress);
|
||||
return pc();
|
||||
}
|
||||
|
||||
address MacroAssembler::arrays_equals(Register a1, Register a2, Register tmp3,
|
||||
Register tmp4, Register tmp5, Register result,
|
||||
Register cnt1, int elem_size) {
|
||||
void MacroAssembler::arrays_equals(Register a1, Register a2, Register tmp3,
|
||||
Register tmp4, Register tmp5, Register result,
|
||||
Register cnt1, int elem_size) {
|
||||
Label DONE, SAME;
|
||||
Register tmp1 = rscratch1;
|
||||
Register tmp2 = rscratch2;
|
||||
@@ -5200,7 +5185,7 @@ address MacroAssembler::arrays_equals(Register a1, Register a2, Register tmp3,
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Label NEXT_DWORD, SHORT, TAIL, TAIL2, STUB,
|
||||
Label NEXT_DWORD, SHORT, TAIL, TAIL2, STUB, EARLY_OUT,
|
||||
CSET_EQ, LAST_CHECK;
|
||||
mov(result, false);
|
||||
cbz(a1, DONE);
|
||||
@@ -5259,14 +5244,10 @@ address MacroAssembler::arrays_equals(Register a1, Register a2, Register tmp3,
|
||||
cbnz(tmp5, DONE);
|
||||
RuntimeAddress stub = RuntimeAddress(StubRoutines::aarch64::large_array_equals());
|
||||
assert(stub.target() != NULL, "array_equals_long stub has not been generated");
|
||||
address tpc = trampoline_call(stub);
|
||||
if (tpc == NULL) {
|
||||
DEBUG_ONLY(reset_labels5(SHORT, LAST_CHECK, CSET_EQ, SAME, DONE));
|
||||
postcond(pc() == badAddress);
|
||||
return NULL;
|
||||
}
|
||||
trampoline_call(stub);
|
||||
b(DONE);
|
||||
|
||||
bind(EARLY_OUT);
|
||||
// (a1 != null && a2 == null) || (a1 != null && a2 != null && a1 == a2)
|
||||
// so, if a2 == null => return false(0), else return true, so we can return a2
|
||||
mov(result, a2);
|
||||
@@ -5293,8 +5274,6 @@ address MacroAssembler::arrays_equals(Register a1, Register a2, Register tmp3,
|
||||
bind(DONE);
|
||||
|
||||
BLOCK_COMMENT("} array_equals");
|
||||
postcond(pc() != badAddress);
|
||||
return pc();
|
||||
}
|
||||
|
||||
// Compare Strings
|
||||
@@ -5402,7 +5381,7 @@ const int MacroAssembler::zero_words_block_size = 8;
|
||||
// cnt: Count in HeapWords.
|
||||
//
|
||||
// ptr, cnt, rscratch1, and rscratch2 are clobbered.
|
||||
address MacroAssembler::zero_words(Register ptr, Register cnt)
|
||||
void MacroAssembler::zero_words(Register ptr, Register cnt)
|
||||
{
|
||||
assert(is_power_of_2(zero_words_block_size), "adjust this");
|
||||
assert(ptr == r10 && cnt == r11, "mismatch in register usage");
|
||||
@@ -5412,15 +5391,10 @@ address MacroAssembler::zero_words(Register ptr, Register cnt)
|
||||
Label around, done, done16;
|
||||
br(LO, around);
|
||||
{
|
||||
RuntimeAddress zero_blocks = RuntimeAddress(StubRoutines::aarch64::zero_blocks());
|
||||
RuntimeAddress zero_blocks = RuntimeAddress(StubRoutines::aarch64::zero_blocks());
|
||||
assert(zero_blocks.target() != NULL, "zero_blocks stub has not been generated");
|
||||
if (StubRoutines::aarch64::complete()) {
|
||||
address tpc = trampoline_call(zero_blocks);
|
||||
if (tpc == NULL) {
|
||||
DEBUG_ONLY(reset_labels1(around));
|
||||
postcond(pc() == badAddress);
|
||||
return NULL;
|
||||
}
|
||||
trampoline_call(zero_blocks);
|
||||
} else {
|
||||
bl(zero_blocks);
|
||||
}
|
||||
@@ -5441,8 +5415,6 @@ address MacroAssembler::zero_words(Register ptr, Register cnt)
|
||||
bind(l);
|
||||
}
|
||||
BLOCK_COMMENT("} zero_words");
|
||||
postcond(pc() != badAddress);
|
||||
return pc();
|
||||
}
|
||||
|
||||
// base: Address of a buffer to be zeroed, 8 bytes aligned.
|
||||
@@ -5455,15 +5427,14 @@ void MacroAssembler::zero_words(Register base, uint64_t cnt)
|
||||
if (i) str(zr, Address(base));
|
||||
|
||||
if (cnt <= SmallArraySize / BytesPerLong) {
|
||||
for (; i < (int)cnt; i += 2) {
|
||||
for (; i < (int)cnt; i += 2)
|
||||
stp(zr, zr, Address(base, i * wordSize));
|
||||
}
|
||||
} else {
|
||||
const int unroll = 4; // Number of stp(zr, zr) instructions we'll unroll
|
||||
int remainder = cnt % (2 * unroll);
|
||||
for (; i < remainder; i += 2) {
|
||||
for (; i < remainder; i += 2)
|
||||
stp(zr, zr, Address(base, i * wordSize));
|
||||
}
|
||||
|
||||
Label loop;
|
||||
Register cnt_reg = rscratch1;
|
||||
Register loop_base = rscratch2;
|
||||
@@ -5473,9 +5444,8 @@ void MacroAssembler::zero_words(Register base, uint64_t cnt)
|
||||
add(loop_base, base, (remainder - 2) * wordSize);
|
||||
bind(loop);
|
||||
sub(cnt_reg, cnt_reg, 2 * unroll);
|
||||
for (i = 1; i < unroll; i++) {
|
||||
for (i = 1; i < unroll; i++)
|
||||
stp(zr, zr, Address(loop_base, 2 * i * wordSize));
|
||||
}
|
||||
stp(zr, zr, Address(pre(loop_base, 2 * unroll * wordSize)));
|
||||
cbnz(cnt_reg, loop);
|
||||
}
|
||||
@@ -5691,9 +5661,9 @@ void MacroAssembler::encode_iso_array(Register src, Register dst,
|
||||
|
||||
|
||||
// Inflate byte[] array to char[].
|
||||
address MacroAssembler::byte_array_inflate(Register src, Register dst, Register len,
|
||||
FloatRegister vtmp1, FloatRegister vtmp2,
|
||||
FloatRegister vtmp3, Register tmp4) {
|
||||
void MacroAssembler::byte_array_inflate(Register src, Register dst, Register len,
|
||||
FloatRegister vtmp1, FloatRegister vtmp2, FloatRegister vtmp3,
|
||||
Register tmp4) {
|
||||
Label big, done, after_init, to_stub;
|
||||
|
||||
assert_different_registers(src, dst, len, tmp4, rscratch1);
|
||||
@@ -5730,14 +5700,9 @@ address MacroAssembler::byte_array_inflate(Register src, Register dst, Register
|
||||
|
||||
if (SoftwarePrefetchHintDistance >= 0) {
|
||||
bind(to_stub);
|
||||
RuntimeAddress stub = RuntimeAddress(StubRoutines::aarch64::large_byte_array_inflate());
|
||||
RuntimeAddress stub = RuntimeAddress(StubRoutines::aarch64::large_byte_array_inflate());
|
||||
assert(stub.target() != NULL, "large_byte_array_inflate stub has not been generated");
|
||||
address tpc = trampoline_call(stub);
|
||||
if (tpc == NULL) {
|
||||
DEBUG_ONLY(reset_labels2(big, done));
|
||||
postcond(pc() == badAddress);
|
||||
return NULL;
|
||||
}
|
||||
trampoline_call(stub);
|
||||
b(after_init);
|
||||
}
|
||||
|
||||
@@ -5791,8 +5756,6 @@ address MacroAssembler::byte_array_inflate(Register src, Register dst, Register
|
||||
strq(vtmp3, Address(dst, -16));
|
||||
|
||||
bind(done);
|
||||
postcond(pc() != badAddress);
|
||||
return pc();
|
||||
}
|
||||
|
||||
// Compress char[] array to byte[].
|
||||
@@ -5811,14 +5774,10 @@ void MacroAssembler::char_array_compress(Register src, Register dst, Register le
|
||||
// by the call to JavaThread::aarch64_get_thread_helper() or, indeed,
|
||||
// the call setup code.
|
||||
//
|
||||
// On Linux, aarch64_get_thread_helper() clobbers only r0, r1, and flags.
|
||||
// On other systems, the helper is a usual C function.
|
||||
// aarch64_get_thread_helper() clobbers only r0, r1, and flags.
|
||||
//
|
||||
void MacroAssembler::get_thread(Register dst) {
|
||||
RegSet saved_regs =
|
||||
LINUX_ONLY(RegSet::range(r0, r1) + lr - dst)
|
||||
NOT_LINUX (RegSet::range(r0, r17) + lr - dst);
|
||||
|
||||
RegSet saved_regs = RegSet::range(r0, r1) + BSD_ONLY(RegSet::range(r2, r17)) + lr - dst;
|
||||
push(saved_regs, sp);
|
||||
|
||||
mov(lr, CAST_FROM_FN_PTR(address, JavaThread::aarch64_get_thread_helper));
|
||||
|
||||
@@ -88,7 +88,7 @@ class MacroAssembler: public Assembler {
|
||||
= (operand_valid_for_logical_immediate(false /*is32*/,
|
||||
(uint64_t)Universe::narrow_klass_base())
|
||||
&& ((uint64_t)Universe::narrow_klass_base()
|
||||
> (1ULL << log2_intptr((uintptr_t)Universe::narrow_klass_range()))));
|
||||
> (1ULL << log2_intptr(Universe::narrow_klass_range()))));
|
||||
}
|
||||
|
||||
// These routines should emit JVMTI PopFrame and ForceEarlyReturn handling code.
|
||||
@@ -1008,8 +1008,6 @@ public:
|
||||
|
||||
void atomic_xchg(Register prev, Register newv, Register addr);
|
||||
void atomic_xchgw(Register prev, Register newv, Register addr);
|
||||
void atomic_xchgl(Register prev, Register newv, Register addr);
|
||||
void atomic_xchglw(Register prev, Register newv, Register addr);
|
||||
void atomic_xchgal(Register prev, Register newv, Register addr);
|
||||
void atomic_xchgalw(Register prev, Register newv, Register addr);
|
||||
|
||||
@@ -1031,16 +1029,6 @@ public:
|
||||
private:
|
||||
void compare_eq(Register rn, Register rm, enum operand_size size);
|
||||
|
||||
#ifdef ASSERT
|
||||
// Macro short-hand support to clean-up after a failed call to trampoline
|
||||
// call generation (see trampoline_call() below), when a set of Labels must
|
||||
// be reset (before returning).
|
||||
#define reset_labels1(L1) L1.reset()
|
||||
#define reset_labels2(L1, L2) L1.reset(); L2.reset()
|
||||
#define reset_labels3(L1, L2, L3) L1.reset(); reset_labels2(L2, L3)
|
||||
#define reset_labels5(L1, L2, L3, L4, L5) reset_labels2(L1, L2); reset_labels3(L3, L4, L5)
|
||||
#endif
|
||||
|
||||
public:
|
||||
// Calls
|
||||
|
||||
@@ -1222,24 +1210,24 @@ public:
|
||||
Register tmp1, Register tmp2, FloatRegister vtmp1,
|
||||
FloatRegister vtmp2, FloatRegister vtmp3, int ae);
|
||||
|
||||
address has_negatives(Register ary1, Register len, Register result);
|
||||
void has_negatives(Register ary1, Register len, Register result);
|
||||
|
||||
address arrays_equals(Register a1, Register a2, Register result, Register cnt1,
|
||||
Register tmp1, Register tmp2, Register tmp3, int elem_size);
|
||||
void arrays_equals(Register a1, Register a2, Register result, Register cnt1,
|
||||
Register tmp1, Register tmp2, Register tmp3, int elem_size);
|
||||
|
||||
void string_equals(Register a1, Register a2, Register result, Register cnt1,
|
||||
int elem_size);
|
||||
|
||||
void fill_words(Register base, Register cnt, Register value);
|
||||
void zero_words(Register base, uint64_t cnt);
|
||||
address zero_words(Register ptr, Register cnt);
|
||||
void zero_words(Register ptr, Register cnt);
|
||||
void zero_dcache_blocks(Register base, Register cnt);
|
||||
|
||||
static const int zero_words_block_size;
|
||||
|
||||
address byte_array_inflate(Register src, Register dst, Register len,
|
||||
FloatRegister vtmp1, FloatRegister vtmp2,
|
||||
FloatRegister vtmp3, Register tmp4);
|
||||
void byte_array_inflate(Register src, Register dst, Register len,
|
||||
FloatRegister vtmp1, FloatRegister vtmp2,
|
||||
FloatRegister vtmp3, Register tmp4);
|
||||
|
||||
void char_array_compress(Register src, Register dst, Register len,
|
||||
FloatRegister tmp1Reg, FloatRegister tmp2Reg,
|
||||
|
||||
@@ -26,12 +26,10 @@
|
||||
#include "precompiled.hpp"
|
||||
#include "register_aarch64.hpp"
|
||||
|
||||
const int ConcreteRegisterImpl::max_gpr = RegisterImpl::number_of_registers *
|
||||
RegisterImpl::max_slots_per_register;
|
||||
const int ConcreteRegisterImpl::max_gpr = RegisterImpl::number_of_registers << 1;
|
||||
|
||||
const int ConcreteRegisterImpl::max_fpr
|
||||
= ConcreteRegisterImpl::max_gpr +
|
||||
FloatRegisterImpl::number_of_registers * FloatRegisterImpl::max_slots_per_register;
|
||||
= ConcreteRegisterImpl::max_gpr + (FloatRegisterImpl::number_of_registers << 1);
|
||||
|
||||
const char* RegisterImpl::name() const {
|
||||
const char* names[number_of_registers] = {
|
||||
|
||||
@@ -44,8 +44,7 @@ class RegisterImpl: public AbstractRegisterImpl {
|
||||
enum {
|
||||
number_of_registers = 32,
|
||||
number_of_byte_registers = 32,
|
||||
number_of_registers_for_jvmci = 34, // Including SP and ZR.
|
||||
max_slots_per_register = 2
|
||||
number_of_registers_for_jvmci = 34 // Including SP and ZR.
|
||||
};
|
||||
|
||||
// derived registers, offsets, and addresses
|
||||
@@ -139,10 +138,7 @@ inline FloatRegister as_FloatRegister(int encoding) {
|
||||
class FloatRegisterImpl: public AbstractRegisterImpl {
|
||||
public:
|
||||
enum {
|
||||
number_of_registers = 32,
|
||||
max_slots_per_register = 4,
|
||||
save_slots_per_register = 2,
|
||||
extra_save_slots_per_register = max_slots_per_register - save_slots_per_register
|
||||
number_of_registers = 32
|
||||
};
|
||||
|
||||
// construction
|
||||
@@ -151,7 +147,7 @@ class FloatRegisterImpl: public AbstractRegisterImpl {
|
||||
VMReg as_VMReg();
|
||||
|
||||
// derived registers, offsets, and addresses
|
||||
FloatRegister successor() const { return as_FloatRegister((encoding() + 1) % 32); }
|
||||
FloatRegister successor() const { return as_FloatRegister(encoding() + 1); }
|
||||
|
||||
// accessors
|
||||
int encoding() const { assert(is_valid(), "invalid register"); return (intptr_t)this; }
|
||||
@@ -208,8 +204,8 @@ class ConcreteRegisterImpl : public AbstractRegisterImpl {
|
||||
// There is no requirement that any ordering here matches any ordering c2 gives
|
||||
// it's optoregs.
|
||||
|
||||
number_of_registers = (RegisterImpl::max_slots_per_register * RegisterImpl::number_of_registers +
|
||||
FloatRegisterImpl::max_slots_per_register * FloatRegisterImpl::number_of_registers +
|
||||
number_of_registers = (2 * RegisterImpl::number_of_registers +
|
||||
4 * FloatRegisterImpl::number_of_registers +
|
||||
1) // flags
|
||||
};
|
||||
|
||||
|
||||
@@ -98,15 +98,15 @@ class RegisterSaver {
|
||||
// Capture info about frame layout
|
||||
enum layout {
|
||||
fpu_state_off = 0,
|
||||
fpu_state_end = fpu_state_off + FPUStateSizeInWords - 1,
|
||||
fpu_state_end = fpu_state_off+FPUStateSizeInWords-1,
|
||||
// The frame sender code expects that rfp will be in
|
||||
// the "natural" place and will override any oopMap
|
||||
// setting for it. We must therefore force the layout
|
||||
// so that it agrees with the frame sender code.
|
||||
r0_off = fpu_state_off + FPUStateSizeInWords,
|
||||
rfp_off = r0_off + (RegisterImpl::number_of_registers - 2) * RegisterImpl::max_slots_per_register,
|
||||
return_off = rfp_off + RegisterImpl::max_slots_per_register, // slot for return address
|
||||
reg_save_size = return_off + RegisterImpl::max_slots_per_register};
|
||||
r0_off = fpu_state_off+FPUStateSizeInWords,
|
||||
rfp_off = r0_off + 30 * 2,
|
||||
return_off = rfp_off + 2, // slot for return address
|
||||
reg_save_size = return_off + 2};
|
||||
|
||||
};
|
||||
|
||||
@@ -114,20 +114,19 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
||||
#if COMPILER2_OR_JVMCI
|
||||
if (save_vectors) {
|
||||
// Save upper half of vector registers
|
||||
int vect_words = FloatRegisterImpl::number_of_registers * FloatRegisterImpl::extra_save_slots_per_register /
|
||||
VMRegImpl::slots_per_word;
|
||||
int vect_words = 32 * 8 / wordSize;
|
||||
additional_frame_words += vect_words;
|
||||
}
|
||||
#else
|
||||
assert(!save_vectors, "vectors are generated only by C2 and JVMCI");
|
||||
#endif
|
||||
|
||||
int frame_size_in_bytes = align_up(additional_frame_words * wordSize +
|
||||
reg_save_size * BytesPerInt, 16);
|
||||
int frame_size_in_bytes = align_up(additional_frame_words*wordSize +
|
||||
reg_save_size*BytesPerInt, 16);
|
||||
// OopMap frame size is in compiler stack slots (jint's) not bytes or words
|
||||
int frame_size_in_slots = frame_size_in_bytes / BytesPerInt;
|
||||
// The caller will allocate additional_frame_words
|
||||
int additional_frame_slots = additional_frame_words * wordSize / BytesPerInt;
|
||||
int additional_frame_slots = additional_frame_words*wordSize / BytesPerInt;
|
||||
// CodeBlob frame size is in words.
|
||||
int frame_size_in_words = frame_size_in_bytes / wordSize;
|
||||
*total_frame_words = frame_size_in_words;
|
||||
@@ -147,10 +146,10 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
||||
for (int i = 0; i < RegisterImpl::number_of_registers; i++) {
|
||||
Register r = as_Register(i);
|
||||
if (r < rheapbase && r != rscratch1 && r != rscratch2) {
|
||||
// SP offsets are in 4-byte words.
|
||||
// Register slots are 8 bytes wide, 32 floating-point registers.
|
||||
int sp_offset = RegisterImpl::max_slots_per_register * i +
|
||||
FloatRegisterImpl::save_slots_per_register * FloatRegisterImpl::number_of_registers;
|
||||
int sp_offset = 2 * (i + 32); // SP offsets are in 4-byte words,
|
||||
// register slots are 8 bytes
|
||||
// wide, 32 floating-point
|
||||
// registers
|
||||
oop_map->set_callee_saved(VMRegImpl::stack2reg(sp_offset + additional_frame_slots),
|
||||
r->as_VMReg());
|
||||
}
|
||||
@@ -158,8 +157,7 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
|
||||
|
||||
for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
|
||||
FloatRegister r = as_FloatRegister(i);
|
||||
int sp_offset = save_vectors ? (FloatRegisterImpl::max_slots_per_register * i) :
|
||||
(FloatRegisterImpl::save_slots_per_register * i);
|
||||
int sp_offset = save_vectors ? (4 * i) : (2 * i);
|
||||
oop_map->set_callee_saved(VMRegImpl::stack2reg(sp_offset),
|
||||
r->as_VMReg());
|
||||
}
|
||||
|
||||
@@ -26,7 +26,6 @@
|
||||
#include "precompiled.hpp"
|
||||
#include "asm/macroAssembler.hpp"
|
||||
#include "asm/macroAssembler.inline.hpp"
|
||||
#include "atomic_aarch64.hpp"
|
||||
#include "gc/shared/barrierSet.hpp"
|
||||
#include "gc/shared/barrierSetAssembler.hpp"
|
||||
#include "interpreter/interpreter.hpp"
|
||||
@@ -36,7 +35,6 @@
|
||||
#include "oops/objArrayKlass.hpp"
|
||||
#include "oops/oop.inline.hpp"
|
||||
#include "prims/methodHandles.hpp"
|
||||
#include "runtime/atomic.hpp"
|
||||
#include "runtime/frame.inline.hpp"
|
||||
#include "runtime/handles.inline.hpp"
|
||||
#include "runtime/sharedRuntime.hpp"
|
||||
@@ -1331,7 +1329,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
//
|
||||
// If 'from' and/or 'to' are aligned on 4-byte boundaries, we let
|
||||
// the hardware handle it. The two dwords within qwords that span
|
||||
// cache line boundaries will still be loaded and stored atomically.
|
||||
// cache line boundaries will still be loaded and stored atomicly.
|
||||
//
|
||||
// Side Effects:
|
||||
// disjoint_int_copy_entry is set to the no-overlap entry point
|
||||
@@ -1396,7 +1394,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
//
|
||||
// If 'from' and/or 'to' are aligned on 4-byte boundaries, we let
|
||||
// the hardware handle it. The two dwords within qwords that span
|
||||
// cache line boundaries will still be loaded and stored atomically.
|
||||
// cache line boundaries will still be loaded and stored atomicly.
|
||||
//
|
||||
address generate_conjoint_copy(int size, bool aligned, bool is_oop, address nooverlap_target,
|
||||
address *entry, const char *name,
|
||||
@@ -1556,7 +1554,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
//
|
||||
// If 'from' and/or 'to' are aligned on 4-byte boundaries, we let
|
||||
// the hardware handle it. The two dwords within qwords that span
|
||||
// cache line boundaries will still be loaded and stored atomically.
|
||||
// cache line boundaries will still be loaded and stored atomicly.
|
||||
//
|
||||
// Side Effects:
|
||||
// disjoint_int_copy_entry is set to the no-overlap entry point
|
||||
@@ -1580,7 +1578,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
//
|
||||
// If 'from' and/or 'to' are aligned on 4-byte boundaries, we let
|
||||
// the hardware handle it. The two dwords within qwords that span
|
||||
// cache line boundaries will still be loaded and stored atomically.
|
||||
// cache line boundaries will still be loaded and stored atomicly.
|
||||
//
|
||||
address generate_conjoint_int_copy(bool aligned, address nooverlap_target,
|
||||
address *entry, const char *name,
|
||||
@@ -3234,14 +3232,11 @@ class StubGenerator: public StubCodeGenerator {
|
||||
Register buff = c_rarg1;
|
||||
Register len = c_rarg2;
|
||||
Register nmax = r4;
|
||||
Register base = r5;
|
||||
Register base = r5;
|
||||
Register count = r6;
|
||||
Register temp0 = rscratch1;
|
||||
Register temp1 = rscratch2;
|
||||
FloatRegister vbytes = v0;
|
||||
FloatRegister vs1acc = v1;
|
||||
FloatRegister vs2acc = v2;
|
||||
FloatRegister vtable = v3;
|
||||
Register temp2 = r7;
|
||||
|
||||
// Max number of bytes we can process before having to take the mod
|
||||
// 0x15B0 is 5552 in decimal, the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1
|
||||
@@ -3251,10 +3246,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
__ mov(base, BASE);
|
||||
__ mov(nmax, NMAX);
|
||||
|
||||
// Load accumulation coefficients for the upper 16 bits
|
||||
__ lea(temp0, ExternalAddress((address) StubRoutines::aarch64::_adler_table));
|
||||
__ ld1(vtable, __ T16B, Address(temp0));
|
||||
|
||||
// s1 is initialized to the lower 16 bits of adler
|
||||
// s2 is initialized to the upper 16 bits of adler
|
||||
__ ubfx(s2, adler, 16, 16); // s2 = ((adler >> 16) & 0xffff)
|
||||
@@ -3295,8 +3286,53 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
__ bind(L_nmax_loop);
|
||||
|
||||
generate_updateBytesAdler32_accum(s1, s2, buff, temp0, temp1,
|
||||
vbytes, vs1acc, vs2acc, vtable);
|
||||
__ ldp(temp0, temp1, Address(__ post(buff, 16)));
|
||||
|
||||
__ add(s1, s1, temp0, ext::uxtb);
|
||||
__ ubfx(temp2, temp0, 8, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 16, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 24, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 32, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 40, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 48, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp0, Assembler::LSR, 56);
|
||||
__ add(s2, s2, s1);
|
||||
|
||||
__ add(s1, s1, temp1, ext::uxtb);
|
||||
__ ubfx(temp2, temp1, 8, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 16, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 24, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 32, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 40, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 48, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp1, Assembler::LSR, 56);
|
||||
__ add(s2, s2, s1);
|
||||
|
||||
__ subs(count, count, 16);
|
||||
__ br(Assembler::HS, L_nmax_loop);
|
||||
@@ -3339,8 +3375,53 @@ class StubGenerator: public StubCodeGenerator {
|
||||
|
||||
__ bind(L_by16_loop);
|
||||
|
||||
generate_updateBytesAdler32_accum(s1, s2, buff, temp0, temp1,
|
||||
vbytes, vs1acc, vs2acc, vtable);
|
||||
__ ldp(temp0, temp1, Address(__ post(buff, 16)));
|
||||
|
||||
__ add(s1, s1, temp0, ext::uxtb);
|
||||
__ ubfx(temp2, temp0, 8, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 16, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 24, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 32, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 40, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp0, 48, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp0, Assembler::LSR, 56);
|
||||
__ add(s2, s2, s1);
|
||||
|
||||
__ add(s1, s1, temp1, ext::uxtb);
|
||||
__ ubfx(temp2, temp1, 8, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 16, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 24, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 32, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 40, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ ubfx(temp2, temp1, 48, 8);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp2);
|
||||
__ add(s2, s2, s1);
|
||||
__ add(s1, s1, temp1, Assembler::LSR, 56);
|
||||
__ add(s2, s2, s1);
|
||||
|
||||
__ subs(len, len, 16);
|
||||
__ br(Assembler::HS, L_by16_loop);
|
||||
@@ -3394,43 +3475,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
return start;
|
||||
}
|
||||
|
||||
void generate_updateBytesAdler32_accum(Register s1, Register s2, Register buff,
|
||||
Register temp0, Register temp1, FloatRegister vbytes,
|
||||
FloatRegister vs1acc, FloatRegister vs2acc, FloatRegister vtable) {
|
||||
// Below is a vectorized implementation of updating s1 and s2 for 16 bytes.
|
||||
// We use b1, b2, ..., b16 to denote the 16 bytes loaded in each iteration.
|
||||
// In non-vectorized code, we update s1 and s2 as:
|
||||
// s1 <- s1 + b1
|
||||
// s2 <- s2 + s1
|
||||
// s1 <- s1 + b2
|
||||
// s2 <- s2 + b1
|
||||
// ...
|
||||
// s1 <- s1 + b16
|
||||
// s2 <- s2 + s1
|
||||
// Putting above assignments together, we have:
|
||||
// s1_new = s1 + b1 + b2 + ... + b16
|
||||
// s2_new = s2 + (s1 + b1) + (s1 + b1 + b2) + ... + (s1 + b1 + b2 + ... + b16)
|
||||
// = s2 + s1 * 16 + (b1 * 16 + b2 * 15 + ... + b16 * 1)
|
||||
// = s2 + s1 * 16 + (b1, b2, ... b16) dot (16, 15, ... 1)
|
||||
__ ld1(vbytes, __ T16B, Address(__ post(buff, 16)));
|
||||
|
||||
// s2 = s2 + s1 * 16
|
||||
__ add(s2, s2, s1, Assembler::LSL, 4);
|
||||
|
||||
// vs1acc = b1 + b2 + b3 + ... + b16
|
||||
// vs2acc = (b1 * 16) + (b2 * 15) + (b3 * 14) + ... + (b16 * 1)
|
||||
__ umullv(vs2acc, __ T8B, vtable, vbytes);
|
||||
__ umlalv(vs2acc, __ T16B, vtable, vbytes);
|
||||
__ uaddlv(vs1acc, __ T16B, vbytes);
|
||||
__ uaddlv(vs2acc, __ T8H, vs2acc);
|
||||
|
||||
// s1 = s1 + vs1acc, s2 = s2 + vs2acc
|
||||
__ fmovd(temp0, vs1acc);
|
||||
__ fmovd(temp1, vs2acc);
|
||||
__ add(s1, s1, temp0);
|
||||
__ add(s2, s2, temp1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Arguments:
|
||||
*
|
||||
@@ -4688,315 +4732,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
return start;
|
||||
}
|
||||
|
||||
#ifdef LINUX
|
||||
|
||||
// ARMv8.1 LSE versions of the atomic stubs used by Atomic::PlatformXX.
|
||||
//
|
||||
// If LSE is in use, generate LSE versions of all the stubs. The
|
||||
// non-LSE versions are in atomic_aarch64.S.
|
||||
|
||||
// class AtomicStubMark records the entry point of a stub and the
|
||||
// stub pointer which will point to it. The stub pointer is set to
|
||||
// the entry point when ~AtomicStubMark() is called, which must be
|
||||
// after ICache::invalidate_range. This ensures safe publication of
|
||||
// the generated code.
|
||||
class AtomicStubMark {
|
||||
address _entry_point;
|
||||
aarch64_atomic_stub_t *_stub;
|
||||
MacroAssembler *_masm;
|
||||
public:
|
||||
AtomicStubMark(MacroAssembler *masm, aarch64_atomic_stub_t *stub) {
|
||||
_masm = masm;
|
||||
__ align(32);
|
||||
_entry_point = __ pc();
|
||||
_stub = stub;
|
||||
}
|
||||
~AtomicStubMark() {
|
||||
*_stub = (aarch64_atomic_stub_t)_entry_point;
|
||||
}
|
||||
};
|
||||
|
||||
// NB: For memory_order_conservative we need a trailing membar after
|
||||
// LSE atomic operations but not a leading membar.
|
||||
//
|
||||
// We don't need a leading membar because a clause in the Arm ARM
|
||||
// says:
|
||||
//
|
||||
// Barrier-ordered-before
|
||||
//
|
||||
// Barrier instructions order prior Memory effects before subsequent
|
||||
// Memory effects generated by the same Observer. A read or a write
|
||||
// RW1 is Barrier-ordered-before a read or a write RW 2 from the same
|
||||
// Observer if and only if RW1 appears in program order before RW 2
|
||||
// and [ ... ] at least one of RW 1 and RW 2 is generated by an atomic
|
||||
// instruction with both Acquire and Release semantics.
|
||||
//
|
||||
// All the atomic instructions {ldaddal, swapal, casal} have Acquire
|
||||
// and Release semantics, therefore we don't need a leading
|
||||
// barrier. However, there is no corresponding Barrier-ordered-after
|
||||
// relationship, therefore we need a trailing membar to prevent a
|
||||
// later store or load from being reordered with the store in an
|
||||
// atomic instruction.
|
||||
//
|
||||
// This was checked by using the herd7 consistency model simulator
|
||||
// (http://diy.inria.fr/) with this test case:
|
||||
//
|
||||
// AArch64 LseCas
|
||||
// { 0:X1=x; 0:X2=y; 1:X1=x; 1:X2=y; }
|
||||
// P0 | P1;
|
||||
// LDR W4, [X2] | MOV W3, #0;
|
||||
// DMB LD | MOV W4, #1;
|
||||
// LDR W3, [X1] | CASAL W3, W4, [X1];
|
||||
// | DMB ISH;
|
||||
// | STR W4, [X2];
|
||||
// exists
|
||||
// (0:X3=0 /\ 0:X4=1)
|
||||
//
|
||||
// If X3 == 0 && X4 == 1, the store to y in P1 has been reordered
|
||||
// with the store to x in P1. Without the DMB in P1 this may happen.
|
||||
//
|
||||
// At the time of writing we don't know of any AArch64 hardware that
|
||||
// reorders stores in this way, but the Reference Manual permits it.
|
||||
|
||||
void gen_cas_entry(Assembler::operand_size size,
|
||||
atomic_memory_order order) {
|
||||
Register prev = r3, ptr = c_rarg0, compare_val = c_rarg1,
|
||||
exchange_val = c_rarg2;
|
||||
bool acquire, release;
|
||||
switch (order) {
|
||||
case memory_order_relaxed:
|
||||
acquire = false;
|
||||
release = false;
|
||||
break;
|
||||
default:
|
||||
acquire = true;
|
||||
release = true;
|
||||
break;
|
||||
}
|
||||
__ mov(prev, compare_val);
|
||||
__ lse_cas(prev, exchange_val, ptr, size, acquire, release, /*not_pair*/true);
|
||||
if (order == memory_order_conservative) {
|
||||
__ membar(Assembler::StoreStore|Assembler::StoreLoad);
|
||||
}
|
||||
if (size == Assembler::xword) {
|
||||
__ mov(r0, prev);
|
||||
} else {
|
||||
__ movw(r0, prev);
|
||||
}
|
||||
__ ret(lr);
|
||||
}
|
||||
|
||||
void gen_ldaddal_entry(Assembler::operand_size size) {
|
||||
Register prev = r2, addr = c_rarg0, incr = c_rarg1;
|
||||
__ ldaddal(size, incr, prev, addr);
|
||||
__ membar(Assembler::StoreStore|Assembler::StoreLoad);
|
||||
if (size == Assembler::xword) {
|
||||
__ mov(r0, prev);
|
||||
} else {
|
||||
__ movw(r0, prev);
|
||||
}
|
||||
__ ret(lr);
|
||||
}
|
||||
|
||||
void gen_swpal_entry(Assembler::operand_size size) {
|
||||
Register prev = r2, addr = c_rarg0, incr = c_rarg1;
|
||||
__ swpal(size, incr, prev, addr);
|
||||
__ membar(Assembler::StoreStore|Assembler::StoreLoad);
|
||||
if (size == Assembler::xword) {
|
||||
__ mov(r0, prev);
|
||||
} else {
|
||||
__ movw(r0, prev);
|
||||
}
|
||||
__ ret(lr);
|
||||
}
|
||||
|
||||
void generate_atomic_entry_points() {
|
||||
if (! UseLSE) {
|
||||
return;
|
||||
}
|
||||
|
||||
__ align(CodeEntryAlignment);
|
||||
StubCodeMark mark(this, "StubRoutines", "atomic entry points");
|
||||
address first_entry = __ pc();
|
||||
|
||||
// All memory_order_conservative
|
||||
AtomicStubMark mark_fetch_add_4(_masm, &aarch64_atomic_fetch_add_4_impl);
|
||||
gen_ldaddal_entry(Assembler::word);
|
||||
AtomicStubMark mark_fetch_add_8(_masm, &aarch64_atomic_fetch_add_8_impl);
|
||||
gen_ldaddal_entry(Assembler::xword);
|
||||
|
||||
AtomicStubMark mark_xchg_4(_masm, &aarch64_atomic_xchg_4_impl);
|
||||
gen_swpal_entry(Assembler::word);
|
||||
AtomicStubMark mark_xchg_8_impl(_masm, &aarch64_atomic_xchg_8_impl);
|
||||
gen_swpal_entry(Assembler::xword);
|
||||
|
||||
// CAS, memory_order_conservative
|
||||
AtomicStubMark mark_cmpxchg_1(_masm, &aarch64_atomic_cmpxchg_1_impl);
|
||||
gen_cas_entry(MacroAssembler::byte, memory_order_conservative);
|
||||
AtomicStubMark mark_cmpxchg_4(_masm, &aarch64_atomic_cmpxchg_4_impl);
|
||||
gen_cas_entry(MacroAssembler::word, memory_order_conservative);
|
||||
AtomicStubMark mark_cmpxchg_8(_masm, &aarch64_atomic_cmpxchg_8_impl);
|
||||
gen_cas_entry(MacroAssembler::xword, memory_order_conservative);
|
||||
|
||||
// CAS, memory_order_relaxed
|
||||
AtomicStubMark mark_cmpxchg_1_relaxed
|
||||
(_masm, &aarch64_atomic_cmpxchg_1_relaxed_impl);
|
||||
gen_cas_entry(MacroAssembler::byte, memory_order_relaxed);
|
||||
AtomicStubMark mark_cmpxchg_4_relaxed
|
||||
(_masm, &aarch64_atomic_cmpxchg_4_relaxed_impl);
|
||||
gen_cas_entry(MacroAssembler::word, memory_order_relaxed);
|
||||
AtomicStubMark mark_cmpxchg_8_relaxed
|
||||
(_masm, &aarch64_atomic_cmpxchg_8_relaxed_impl);
|
||||
gen_cas_entry(MacroAssembler::xword, memory_order_relaxed);
|
||||
|
||||
ICache::invalidate_range(first_entry, __ pc() - first_entry);
|
||||
}
|
||||
#endif // LINUX
|
||||
|
||||
void generate_base64_encode_simdround(Register src, Register dst,
|
||||
FloatRegister codec, u8 size) {
|
||||
|
||||
FloatRegister in0 = v4, in1 = v5, in2 = v6;
|
||||
FloatRegister out0 = v16, out1 = v17, out2 = v18, out3 = v19;
|
||||
FloatRegister ind0 = v20, ind1 = v21, ind2 = v22, ind3 = v23;
|
||||
|
||||
Assembler::SIMD_Arrangement arrangement = size == 16 ? __ T16B : __ T8B;
|
||||
|
||||
__ ld3(in0, in1, in2, arrangement, __ post(src, 3 * size));
|
||||
|
||||
__ ushr(ind0, arrangement, in0, 2);
|
||||
|
||||
__ ushr(ind1, arrangement, in1, 2);
|
||||
__ shl(in0, arrangement, in0, 6);
|
||||
__ orr(ind1, arrangement, ind1, in0);
|
||||
__ ushr(ind1, arrangement, ind1, 2);
|
||||
|
||||
__ ushr(ind2, arrangement, in2, 4);
|
||||
__ shl(in1, arrangement, in1, 4);
|
||||
__ orr(ind2, arrangement, in1, ind2);
|
||||
__ ushr(ind2, arrangement, ind2, 2);
|
||||
|
||||
__ shl(ind3, arrangement, in2, 2);
|
||||
__ ushr(ind3, arrangement, ind3, 2);
|
||||
|
||||
__ tbl(out0, arrangement, codec, 4, ind0);
|
||||
__ tbl(out1, arrangement, codec, 4, ind1);
|
||||
__ tbl(out2, arrangement, codec, 4, ind2);
|
||||
__ tbl(out3, arrangement, codec, 4, ind3);
|
||||
|
||||
__ st4(out0, out1, out2, out3, arrangement, __ post(dst, 4 * size));
|
||||
}
|
||||
|
||||
/**
|
||||
* Arguments:
|
||||
*
|
||||
* Input:
|
||||
* c_rarg0 - src_start
|
||||
* c_rarg1 - src_offset
|
||||
* c_rarg2 - src_length
|
||||
* c_rarg3 - dest_start
|
||||
* c_rarg4 - dest_offset
|
||||
* c_rarg5 - isURL
|
||||
*
|
||||
*/
|
||||
address generate_base64_encodeBlock() {
|
||||
|
||||
static const char toBase64[64] = {
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
|
||||
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/'
|
||||
};
|
||||
|
||||
static const char toBase64URL[64] = {
|
||||
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
|
||||
'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
|
||||
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_'
|
||||
};
|
||||
|
||||
__ align(CodeEntryAlignment);
|
||||
StubCodeMark mark(this, "StubRoutines", "encodeBlock");
|
||||
address start = __ pc();
|
||||
|
||||
Register src = c_rarg0; // source array
|
||||
Register soff = c_rarg1; // source start offset
|
||||
Register send = c_rarg2; // source end offset
|
||||
Register dst = c_rarg3; // dest array
|
||||
Register doff = c_rarg4; // position for writing to dest array
|
||||
Register isURL = c_rarg5; // Base64 or URL chracter set
|
||||
|
||||
// c_rarg6 and c_rarg7 are free to use as temps
|
||||
Register codec = c_rarg6;
|
||||
Register length = c_rarg7;
|
||||
|
||||
Label ProcessData, Process48B, Process24B, Process3B, SIMDExit, Exit;
|
||||
|
||||
__ add(src, src, soff);
|
||||
__ add(dst, dst, doff);
|
||||
__ sub(length, send, soff);
|
||||
|
||||
// load the codec base address
|
||||
__ lea(codec, ExternalAddress((address) toBase64));
|
||||
__ cbz(isURL, ProcessData);
|
||||
__ lea(codec, ExternalAddress((address) toBase64URL));
|
||||
|
||||
__ BIND(ProcessData);
|
||||
|
||||
// too short to formup a SIMD loop, roll back
|
||||
__ cmp(length, (u1)24);
|
||||
__ br(Assembler::LT, Process3B);
|
||||
|
||||
__ ld1(v0, v1, v2, v3, __ T16B, Address(codec));
|
||||
|
||||
__ BIND(Process48B);
|
||||
__ cmp(length, (u1)48);
|
||||
__ br(Assembler::LT, Process24B);
|
||||
generate_base64_encode_simdround(src, dst, v0, 16);
|
||||
__ sub(length, length, 48);
|
||||
__ b(Process48B);
|
||||
|
||||
__ BIND(Process24B);
|
||||
__ cmp(length, (u1)24);
|
||||
__ br(Assembler::LT, SIMDExit);
|
||||
generate_base64_encode_simdround(src, dst, v0, 8);
|
||||
__ sub(length, length, 24);
|
||||
|
||||
__ BIND(SIMDExit);
|
||||
__ cbz(length, Exit);
|
||||
|
||||
__ BIND(Process3B);
|
||||
// 3 src bytes, 24 bits
|
||||
__ ldrb(r10, __ post(src, 1));
|
||||
__ ldrb(r11, __ post(src, 1));
|
||||
__ ldrb(r12, __ post(src, 1));
|
||||
__ orrw(r11, r11, r10, Assembler::LSL, 8);
|
||||
__ orrw(r12, r12, r11, Assembler::LSL, 8);
|
||||
// codec index
|
||||
__ ubfmw(r15, r12, 18, 23);
|
||||
__ ubfmw(r14, r12, 12, 17);
|
||||
__ ubfmw(r13, r12, 6, 11);
|
||||
__ andw(r12, r12, 63);
|
||||
// get the code based on the codec
|
||||
__ ldrb(r15, Address(codec, r15, Address::uxtw(0)));
|
||||
__ ldrb(r14, Address(codec, r14, Address::uxtw(0)));
|
||||
__ ldrb(r13, Address(codec, r13, Address::uxtw(0)));
|
||||
__ ldrb(r12, Address(codec, r12, Address::uxtw(0)));
|
||||
__ strb(r15, __ post(dst, 1));
|
||||
__ strb(r14, __ post(dst, 1));
|
||||
__ strb(r13, __ post(dst, 1));
|
||||
__ strb(r12, __ post(dst, 1));
|
||||
__ sub(length, length, 3);
|
||||
__ cbnz(length, Process3B);
|
||||
|
||||
__ BIND(Exit);
|
||||
__ ret(lr);
|
||||
|
||||
return start;
|
||||
}
|
||||
|
||||
// Continuation point for throwing of implicit exceptions that are
|
||||
// not handled in the current activation. Fabricates an exception
|
||||
// oop and initiates normal exception dispatching in this
|
||||
@@ -6053,10 +5788,6 @@ class StubGenerator: public StubCodeGenerator {
|
||||
StubRoutines::_ghash_processBlocks = generate_ghash_processBlocks();
|
||||
}
|
||||
|
||||
if (UseBASE64Intrinsics) {
|
||||
StubRoutines::_base64_encodeBlock = generate_base64_encodeBlock();
|
||||
}
|
||||
|
||||
if (UseAESIntrinsics) {
|
||||
StubRoutines::_aescrypt_encryptBlock = generate_aescrypt_encryptBlock();
|
||||
StubRoutines::_aescrypt_decryptBlock = generate_aescrypt_decryptBlock();
|
||||
@@ -6085,13 +5816,7 @@ class StubGenerator: public StubCodeGenerator {
|
||||
generate_safefetch("SafeFetchN", sizeof(intptr_t), &StubRoutines::_safefetchN_entry,
|
||||
&StubRoutines::_safefetchN_fault_pc,
|
||||
&StubRoutines::_safefetchN_continuation_pc);
|
||||
#ifdef LINUX
|
||||
|
||||
generate_atomic_entry_points();
|
||||
|
||||
#endif // LINUX
|
||||
|
||||
StubRoutines::aarch64::set_completed();
|
||||
StubRoutines::aarch64::set_completed();
|
||||
}
|
||||
|
||||
public:
|
||||
@@ -6107,30 +5832,3 @@ class StubGenerator: public StubCodeGenerator {
|
||||
void StubGenerator_generate(CodeBuffer* code, bool all) {
|
||||
StubGenerator g(code, all);
|
||||
}
|
||||
|
||||
|
||||
#ifdef LINUX
|
||||
|
||||
// Define pointers to atomic stubs and initialize them to point to the
|
||||
// code in atomic_aarch64.S.
|
||||
|
||||
#define DEFAULT_ATOMIC_OP(OPNAME, SIZE, RELAXED) \
|
||||
extern "C" uint64_t aarch64_atomic_ ## OPNAME ## _ ## SIZE ## RELAXED ## _default_impl \
|
||||
(volatile void *ptr, uint64_t arg1, uint64_t arg2); \
|
||||
aarch64_atomic_stub_t aarch64_atomic_ ## OPNAME ## _ ## SIZE ## RELAXED ## _impl \
|
||||
= aarch64_atomic_ ## OPNAME ## _ ## SIZE ## RELAXED ## _default_impl;
|
||||
|
||||
DEFAULT_ATOMIC_OP(fetch_add, 4, )
|
||||
DEFAULT_ATOMIC_OP(fetch_add, 8, )
|
||||
DEFAULT_ATOMIC_OP(xchg, 4, )
|
||||
DEFAULT_ATOMIC_OP(xchg, 8, )
|
||||
DEFAULT_ATOMIC_OP(cmpxchg, 1, )
|
||||
DEFAULT_ATOMIC_OP(cmpxchg, 4, )
|
||||
DEFAULT_ATOMIC_OP(cmpxchg, 8, )
|
||||
DEFAULT_ATOMIC_OP(cmpxchg, 1, _relaxed)
|
||||
DEFAULT_ATOMIC_OP(cmpxchg, 4, _relaxed)
|
||||
DEFAULT_ATOMIC_OP(cmpxchg, 8, _relaxed)
|
||||
|
||||
#undef DEFAULT_ATOMIC_OP
|
||||
|
||||
#endif // LINUX
|
||||
|
||||
@@ -287,11 +287,6 @@ ATTRIBUTE_ALIGNED(4096) juint StubRoutines::aarch64::_crc_table[] =
|
||||
0xD502ED78UL, 0xAE7D62EDUL, // byte swap of word swap
|
||||
};
|
||||
|
||||
// Accumulation coefficients for adler32 upper 16 bits
|
||||
ATTRIBUTE_ALIGNED(64) jubyte StubRoutines::aarch64::_adler_table[] = {
|
||||
16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1
|
||||
};
|
||||
|
||||
ATTRIBUTE_ALIGNED(64) juint StubRoutines::aarch64::_npio2_hw[] = {
|
||||
// first, various coefficient values: 0.5, invpio2, pio2_1, pio2_1t, pio2_2,
|
||||
// pio2_2t, pio2_3, pio2_3t
|
||||
|
||||
@@ -181,7 +181,6 @@ class aarch64 {
|
||||
|
||||
private:
|
||||
static juint _crc_table[];
|
||||
static jubyte _adler_table[];
|
||||
// begin trigonometric tables block. See comments in .cpp file
|
||||
static juint _npio2_hw[];
|
||||
static jdouble _two_over_pi[];
|
||||
|
||||
@@ -92,10 +92,6 @@ void VM_Version::initialize() {
|
||||
SoftwarePrefetchHintDistance &= ~7;
|
||||
}
|
||||
|
||||
if (FLAG_IS_DEFAULT(ContendedPaddingWidth) && (dcache_line > ContendedPaddingWidth)) {
|
||||
ContendedPaddingWidth = dcache_line;
|
||||
}
|
||||
|
||||
// Enable vendor specific features
|
||||
|
||||
// ThunderX
|
||||
@@ -154,12 +150,6 @@ void VM_Version::initialize() {
|
||||
}
|
||||
}
|
||||
|
||||
if (_cpu == CPU_ARM) {
|
||||
if (FLAG_IS_DEFAULT(UseSignumIntrinsic)) {
|
||||
FLAG_SET_DEFAULT(UseSignumIntrinsic, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (_cpu == CPU_ARM && (_model == 0xd07 || _model2 == 0xd07)) _features |= CPU_STXR_PREFETCH;
|
||||
// If an olde style /proc/cpuinfo (cores == 1) then if _model is an A57 (0xd07)
|
||||
// we assume the worst and assume we could be on a big little system and have
|
||||
@@ -295,10 +285,6 @@ void VM_Version::initialize() {
|
||||
FLAG_SET_DEFAULT(UseGHASHIntrinsics, false);
|
||||
}
|
||||
|
||||
if (FLAG_IS_DEFAULT(UseBASE64Intrinsics)) {
|
||||
UseBASE64Intrinsics = true;
|
||||
}
|
||||
|
||||
if (is_zva_enabled()) {
|
||||
if (FLAG_IS_DEFAULT(UseBlockZeroing)) {
|
||||
FLAG_SET_DEFAULT(UseBlockZeroing, true);
|
||||
@@ -325,6 +311,7 @@ void VM_Version::initialize() {
|
||||
}
|
||||
|
||||
#ifdef COMPILER2
|
||||
|
||||
if (FLAG_IS_DEFAULT(UseMultiplyToLenIntrinsic)) {
|
||||
UseMultiplyToLenIntrinsic = true;
|
||||
}
|
||||
|
||||
@@ -33,17 +33,15 @@ void VMRegImpl::set_regName() {
|
||||
Register reg = ::as_Register(0);
|
||||
int i;
|
||||
for (i = 0; i < ConcreteRegisterImpl::max_gpr ; ) {
|
||||
for (int j = 0 ; j < RegisterImpl::max_slots_per_register ; j++) {
|
||||
regName[i++] = reg->name();
|
||||
}
|
||||
regName[i++] = reg->name();
|
||||
regName[i++] = reg->name();
|
||||
reg = reg->successor();
|
||||
}
|
||||
|
||||
FloatRegister freg = ::as_FloatRegister(0);
|
||||
for ( ; i < ConcreteRegisterImpl::max_fpr ; ) {
|
||||
for (int j = 0 ; j < FloatRegisterImpl::max_slots_per_register ; j++) {
|
||||
regName[i++] = freg->name();
|
||||
}
|
||||
regName[i++] = freg->name();
|
||||
regName[i++] = freg->name();
|
||||
freg = freg->successor();
|
||||
}
|
||||
|
||||
|
||||
@@ -38,14 +38,13 @@ inline Register as_Register() {
|
||||
|
||||
assert( is_Register(), "must be");
|
||||
// Yuk
|
||||
return ::as_Register(value() / RegisterImpl::max_slots_per_register);
|
||||
return ::as_Register(value() >> 1);
|
||||
}
|
||||
|
||||
inline FloatRegister as_FloatRegister() {
|
||||
assert( is_FloatRegister() && is_even(value()), "must be" );
|
||||
// Yuk
|
||||
return ::as_FloatRegister((value() - ConcreteRegisterImpl::max_gpr) /
|
||||
FloatRegisterImpl::max_slots_per_register);
|
||||
return ::as_FloatRegister((value() - ConcreteRegisterImpl::max_gpr) >> 1);
|
||||
}
|
||||
|
||||
inline bool is_concrete() {
|
||||
|
||||
@@ -28,12 +28,11 @@
|
||||
|
||||
inline VMReg RegisterImpl::as_VMReg() {
|
||||
if( this==noreg ) return VMRegImpl::Bad();
|
||||
return VMRegImpl::as_VMReg(encoding() * RegisterImpl::max_slots_per_register);
|
||||
return VMRegImpl::as_VMReg(encoding() << 1 );
|
||||
}
|
||||
|
||||
inline VMReg FloatRegisterImpl::as_VMReg() {
|
||||
return VMRegImpl::as_VMReg((encoding() * FloatRegisterImpl::max_slots_per_register) +
|
||||
ConcreteRegisterImpl::max_gpr);
|
||||
return VMRegImpl::as_VMReg((encoding() << 1) + ConcreteRegisterImpl::max_gpr);
|
||||
}
|
||||
|
||||
#endif // CPU_AARCH64_VM_VMREG_AARCH64_INLINE_HPP
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2021, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
@@ -70,7 +70,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
|
||||
#if (!defined(PRODUCT) && defined(COMPILER2))
|
||||
if (CountCompiledCalls) {
|
||||
__ lea(r16, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
|
||||
__ increment(Address(r16));
|
||||
__ incrementw(Address(r16));
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -145,7 +145,6 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
if (s == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// Count unused bytes in instruction sequences of variable size.
|
||||
// We add them to the computed buffer size in order to avoid
|
||||
// overflow in subsequently generated stubs.
|
||||
@@ -160,7 +159,7 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
#if (!defined(PRODUCT) && defined(COMPILER2))
|
||||
if (CountCompiledCalls) {
|
||||
__ lea(r10, ExternalAddress((address) SharedRuntime::nof_megamorphic_calls_addr()));
|
||||
__ increment(Address(r10));
|
||||
__ incrementw(Address(r10));
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -171,13 +170,11 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
// rscratch2: CompiledICHolder
|
||||
// j_rarg0: Receiver
|
||||
|
||||
// This stub is called from compiled code which has no callee-saved registers,
|
||||
// so all registers except arguments are free at this point.
|
||||
// Most registers are in use; we'll use r16, rmethod, r10, r11
|
||||
const Register recv_klass_reg = r10;
|
||||
const Register holder_klass_reg = r16; // declaring interface klass (DECC)
|
||||
const Register resolved_klass_reg = rmethod; // resolved interface klass (REFC)
|
||||
const Register temp_reg = r11;
|
||||
const Register temp_reg2 = r15;
|
||||
const Register icholder_reg = rscratch2;
|
||||
|
||||
Label L_no_such_interface;
|
||||
@@ -192,10 +189,11 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
__ load_klass(recv_klass_reg, j_rarg0);
|
||||
|
||||
// Receiver subtype check against REFC.
|
||||
// Destroys recv_klass_reg value.
|
||||
__ lookup_interface_method(// inputs: rec. class, interface
|
||||
recv_klass_reg, resolved_klass_reg, noreg,
|
||||
// outputs: scan temp. reg1, scan temp. reg2
|
||||
temp_reg2, temp_reg,
|
||||
recv_klass_reg, temp_reg,
|
||||
L_no_such_interface,
|
||||
/*return_method=*/false);
|
||||
|
||||
@@ -203,6 +201,7 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
start_pc = __ pc();
|
||||
|
||||
// Get selected method from declaring class and itable index
|
||||
__ load_klass(recv_klass_reg, j_rarg0); // restore recv_klass_reg
|
||||
__ lookup_interface_method(// inputs: rec. class, interface, itable index
|
||||
recv_klass_reg, holder_klass_reg, itable_index,
|
||||
// outputs: method, scan temp. reg
|
||||
@@ -212,7 +211,7 @@ VtableStub* VtableStubs::create_itable_stub(int itable_index) {
|
||||
const ptrdiff_t lookupSize = __ pc() - start_pc;
|
||||
|
||||
// Reduce "estimate" such that "padding" does not drop below 8.
|
||||
const ptrdiff_t estimate = 124;
|
||||
const ptrdiff_t estimate = 152;
|
||||
const ptrdiff_t codesize = typecheckSize + lookupSize;
|
||||
slop_delta = (int)(estimate - codesize);
|
||||
slop_bytes += slop_delta;
|
||||
|
||||
@@ -12016,10 +12016,9 @@ instruct cmpFastLock(flagsRegP pcc, iRegP object, iRegP box, iRegP scratch2, iRe
|
||||
#ifdef AARCH64
|
||||
effect(TEMP scratch, TEMP scratch2, TEMP scratch3);
|
||||
#else
|
||||
predicate(!(UseBiasedLocking && !UseOptoBiasInlining));
|
||||
effect(TEMP scratch, TEMP scratch2);
|
||||
#endif
|
||||
ins_cost(DEFAULT_COST*3);
|
||||
ins_cost(100);
|
||||
|
||||
#ifdef AARCH64
|
||||
format %{ "FASTLOCK $object, $box; KILL $scratch, $scratch2, $scratch3" %}
|
||||
@@ -12049,21 +12048,6 @@ instruct cmpFastUnlock(flagsRegP pcc, iRegP object, iRegP box, iRegP scratch2, i
|
||||
ins_pipe(long_memory_op);
|
||||
%}
|
||||
#else
|
||||
instruct cmpFastLock_noBiasInline(flagsRegP pcc, iRegP object, iRegP box, iRegP scratch2,
|
||||
iRegP scratch, iRegP scratch3) %{
|
||||
match(Set pcc (FastLock object box));
|
||||
predicate(UseBiasedLocking && !UseOptoBiasInlining);
|
||||
|
||||
effect(TEMP scratch, TEMP scratch2, TEMP scratch3);
|
||||
ins_cost(DEFAULT_COST*5);
|
||||
|
||||
format %{ "FASTLOCK $object, $box; KILL $scratch, $scratch2, $scratch3" %}
|
||||
ins_encode %{
|
||||
__ fast_lock($object$$Register, $box$$Register, $scratch$$Register, $scratch2$$Register, $scratch3$$Register);
|
||||
%}
|
||||
ins_pipe(long_memory_op);
|
||||
%}
|
||||
|
||||
instruct cmpFastUnlock(flagsRegP pcc, iRegP object, iRegP box, iRegP scratch2, iRegP scratch ) %{
|
||||
match(Set pcc (FastUnlock object box));
|
||||
effect(TEMP scratch, TEMP scratch2);
|
||||
|
||||
@@ -109,7 +109,7 @@ define_pd_global(size_t, CodeCacheExpansionSize, 32*K);
|
||||
// Ergonomics related flags
|
||||
define_pd_global(uint64_t, MaxRAM, 4ULL*G);
|
||||
#endif
|
||||
define_pd_global(uintx, CodeCacheMinBlockLength, 6);
|
||||
define_pd_global(uintx, CodeCacheMinBlockLength, 4);
|
||||
define_pd_global(size_t, CodeCacheMinimumUseSpace, 400*K);
|
||||
|
||||
define_pd_global(bool, TrapBasedRangeChecks, false); // Not needed
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2008, 2018, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2008, 2017, 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
|
||||
@@ -500,7 +500,7 @@ bool frame::is_interpreted_frame_valid(JavaThread* thread) const {
|
||||
Method* m = *interpreter_frame_method_addr();
|
||||
|
||||
// validate the method we'd find in this potential sender
|
||||
if (!Method::is_valid_method(m)) return false;
|
||||
if (!m->is_valid_method()) return false;
|
||||
|
||||
// stack frames shouldn't be much larger than max_stack elements
|
||||
|
||||
|
||||
@@ -69,4 +69,11 @@ const bool HaveVFP = true;
|
||||
#endif
|
||||
#define C1_LIRGENERATOR_MD_HPP "c1_LIRGenerator_arm.hpp"
|
||||
|
||||
#ifdef TARGET_COMPILER_gcc
|
||||
#ifdef ARM32
|
||||
#undef BREAKPOINT
|
||||
#define BREAKPOINT __asm__ volatile ("bkpt")
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#endif // CPU_ARM_VM_GLOBALDEFINITIONS_ARM_HPP
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user