mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 12:09:14 +00:00
Merge branch 'master' into JDK-8303904
# Conflicts: # src/java.desktop/macosx/classes/sun/java2d/metal/MTLGraphicsConfig.java # src/java.desktop/macosx/classes/sun/java2d/opengl/CGLGraphicsConfig.java # src/java.desktop/share/classes/javax/swing/JViewport.java
This commit is contained in:
commit
7dace98389
2
.github/actions/build-jtreg/action.yml
vendored
2
.github/actions/build-jtreg/action.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
2
.github/actions/get-bundles/action.yml
vendored
2
.github/actions/get-bundles/action.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
2
.github/actions/get-gtest/action.yml
vendored
2
.github/actions/get-gtest/action.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
2
.github/actions/get-jtreg/action.yml
vendored
2
.github/actions/get-jtreg/action.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2023, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
2
.github/actions/get-msys2/action.yml
vendored
2
.github/actions/get-msys2/action.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
2
.github/actions/upload-bundles/action.yml
vendored
2
.github/actions/upload-bundles/action.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
6
.github/workflows/build-alpine-linux.yml
vendored
6
.github/workflows/build-alpine-linux.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2024, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -59,7 +59,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build-linux:
|
build-linux:
|
||||||
name: build
|
name: build
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
container:
|
container:
|
||||||
image: alpine:3.20
|
image: alpine:3.20
|
||||||
|
|
||||||
@ -96,6 +96,8 @@ jobs:
|
|||||||
--with-boot-jdk=${{ steps.bootjdk.outputs.path }}
|
--with-boot-jdk=${{ steps.bootjdk.outputs.path }}
|
||||||
--with-zlib=system
|
--with-zlib=system
|
||||||
--with-jmod-compress=zip-1
|
--with-jmod-compress=zip-1
|
||||||
|
--with-external-symbols-in-bundles=none
|
||||||
|
--with-native-debug-symbols-level=1
|
||||||
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
||||||
echo "Dumping config.log:" &&
|
echo "Dumping config.log:" &&
|
||||||
cat config.log &&
|
cat config.log &&
|
||||||
|
|||||||
6
.github/workflows/build-cross-compile.yml
vendored
6
.github/workflows/build-cross-compile.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -48,7 +48,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build-cross-compile:
|
build-cross-compile:
|
||||||
name: build
|
name: build
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@ -179,6 +179,8 @@ jobs:
|
|||||||
--openjdk-target=${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}}
|
--openjdk-target=${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}}
|
||||||
--with-sysroot=sysroot
|
--with-sysroot=sysroot
|
||||||
--with-jmod-compress=zip-1
|
--with-jmod-compress=zip-1
|
||||||
|
--with-external-symbols-in-bundles=none
|
||||||
|
--with-native-debug-symbols-level=1
|
||||||
CC=${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}}-gcc-${{ inputs.gcc-major-version }}
|
CC=${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}}-gcc-${{ inputs.gcc-major-version }}
|
||||||
CXX=${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}}-g++-${{ inputs.gcc-major-version }}
|
CXX=${{ matrix.gnu-arch }}-linux-gnu${{ matrix.gnu-abi}}-g++-${{ inputs.gcc-major-version }}
|
||||||
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
||||||
|
|||||||
24
.github/workflows/build-linux.yml
vendored
24
.github/workflows/build-linux.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -75,7 +75,7 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
build-linux:
|
build-linux:
|
||||||
name: build
|
name: build
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
@ -115,9 +115,21 @@ jobs:
|
|||||||
if [[ '${{ inputs.apt-architecture }}' != '' ]]; then
|
if [[ '${{ inputs.apt-architecture }}' != '' ]]; then
|
||||||
sudo dpkg --add-architecture ${{ inputs.apt-architecture }}
|
sudo dpkg --add-architecture ${{ inputs.apt-architecture }}
|
||||||
fi
|
fi
|
||||||
sudo apt-get update
|
sudo apt update
|
||||||
sudo apt-get install --only-upgrade apt
|
sudo apt install --only-upgrade apt
|
||||||
sudo apt-get install gcc-${{ inputs.gcc-major-version }}${{ inputs.gcc-package-suffix }} g++-${{ inputs.gcc-major-version }}${{ inputs.gcc-package-suffix }} libxrandr-dev${{ steps.arch.outputs.suffix }} libxtst-dev${{ steps.arch.outputs.suffix }} libcups2-dev${{ steps.arch.outputs.suffix }} libasound2-dev${{ steps.arch.outputs.suffix }} ${{ inputs.apt-extra-packages }}
|
sudo apt install \
|
||||||
|
gcc-${{ inputs.gcc-major-version }}${{ inputs.gcc-package-suffix }} \
|
||||||
|
g++-${{ inputs.gcc-major-version }}${{ inputs.gcc-package-suffix }} \
|
||||||
|
libasound2-dev${{ steps.arch.outputs.suffix }} \
|
||||||
|
libcups2-dev${{ steps.arch.outputs.suffix }} \
|
||||||
|
libfontconfig1-dev${{ steps.arch.outputs.suffix }} \
|
||||||
|
libx11-dev${{ steps.arch.outputs.suffix }} \
|
||||||
|
libxext-dev${{ steps.arch.outputs.suffix }} \
|
||||||
|
libxrandr-dev${{ steps.arch.outputs.suffix }} \
|
||||||
|
libxrender-dev${{ steps.arch.outputs.suffix }} \
|
||||||
|
libxt-dev${{ steps.arch.outputs.suffix }} \
|
||||||
|
libxtst-dev${{ steps.arch.outputs.suffix }} \
|
||||||
|
${{ inputs.apt-extra-packages }}
|
||||||
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${{ inputs.gcc-major-version }} 100 --slave /usr/bin/g++ g++ /usr/bin/g++-${{ inputs.gcc-major-version }}
|
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-${{ inputs.gcc-major-version }} 100 --slave /usr/bin/g++ g++ /usr/bin/g++-${{ inputs.gcc-major-version }}
|
||||||
|
|
||||||
- name: 'Configure'
|
- name: 'Configure'
|
||||||
@ -131,6 +143,8 @@ jobs:
|
|||||||
--with-gtest=${{ steps.gtest.outputs.path }}
|
--with-gtest=${{ steps.gtest.outputs.path }}
|
||||||
--with-zlib=system
|
--with-zlib=system
|
||||||
--with-jmod-compress=zip-1
|
--with-jmod-compress=zip-1
|
||||||
|
--with-external-symbols-in-bundles=none
|
||||||
|
--with-native-debug-symbols-level=1
|
||||||
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
||||||
echo "Dumping config.log:" &&
|
echo "Dumping config.log:" &&
|
||||||
cat config.log &&
|
cat config.log &&
|
||||||
|
|||||||
4
.github/workflows/build-macos.yml
vendored
4
.github/workflows/build-macos.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -110,6 +110,8 @@ jobs:
|
|||||||
--with-gtest=${{ steps.gtest.outputs.path }}
|
--with-gtest=${{ steps.gtest.outputs.path }}
|
||||||
--with-zlib=system
|
--with-zlib=system
|
||||||
--with-jmod-compress=zip-1
|
--with-jmod-compress=zip-1
|
||||||
|
--with-external-symbols-in-bundles=none
|
||||||
|
--with-native-debug-symbols-level=1
|
||||||
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
||||||
echo "Dumping config.log:" &&
|
echo "Dumping config.log:" &&
|
||||||
cat config.log &&
|
cat config.log &&
|
||||||
|
|||||||
3
.github/workflows/build-windows.yml
vendored
3
.github/workflows/build-windows.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -134,6 +134,7 @@ jobs:
|
|||||||
--with-gtest=${{ steps.gtest.outputs.path }}
|
--with-gtest=${{ steps.gtest.outputs.path }}
|
||||||
--with-msvc-toolset-version=${{ inputs.msvc-toolset-version }}
|
--with-msvc-toolset-version=${{ inputs.msvc-toolset-version }}
|
||||||
--with-jmod-compress=zip-1
|
--with-jmod-compress=zip-1
|
||||||
|
--with-external-symbols-in-bundles=none
|
||||||
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
${{ inputs.extra-conf-options }} ${{ inputs.configure-arguments }} || (
|
||||||
echo "Dumping config.log:" &&
|
echo "Dumping config.log:" &&
|
||||||
cat config.log &&
|
cat config.log &&
|
||||||
|
|||||||
8
.github/workflows/main.yml
vendored
8
.github/workflows/main.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -57,7 +57,7 @@ jobs:
|
|||||||
|
|
||||||
prepare:
|
prepare:
|
||||||
name: 'Prepare the run'
|
name: 'Prepare the run'
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
env:
|
env:
|
||||||
# List of platforms to exclude by default
|
# List of platforms to exclude by default
|
||||||
EXCLUDED_PLATFORMS: 'alpine-linux-x64'
|
EXCLUDED_PLATFORMS: 'alpine-linux-x64'
|
||||||
@ -405,7 +405,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
platform: linux-x64
|
platform: linux-x64
|
||||||
bootjdk-platform: linux-x64
|
bootjdk-platform: linux-x64
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
debug-suffix: -debug
|
debug-suffix: -debug
|
||||||
|
|
||||||
@ -419,7 +419,7 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
platform: linux-x64
|
platform: linux-x64
|
||||||
bootjdk-platform: linux-x64
|
bootjdk-platform: linux-x64
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-24.04
|
||||||
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
dry-run: ${{ needs.prepare.outputs.dry-run == 'true' }}
|
||||||
static-suffix: "-static"
|
static-suffix: "-static"
|
||||||
|
|
||||||
|
|||||||
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
[general]
|
[general]
|
||||||
project=jdk
|
project=jdk
|
||||||
jbs=JDK
|
jbs=JDK
|
||||||
version=26
|
version=27
|
||||||
|
|
||||||
[checks]
|
[checks]
|
||||||
error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists,copyright
|
error=author,committer,reviewers,merge,issues,executable,symlink,message,hg-tag,whitespace,problemlists,copyright
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
# Welcome to the JDK!
|
# Welcome to the JDK!
|
||||||
|
|
||||||
For build instructions please see the
|
For build instructions please see the
|
||||||
[online documentation](https://openjdk.org/groups/build/doc/building.html),
|
[online documentation](https://git.openjdk.org/jdk/blob/master/doc/building.md),
|
||||||
or either of these files:
|
or either of these files:
|
||||||
|
|
||||||
- [doc/building.html](doc/building.html) (html version)
|
- [doc/building.html](doc/building.html) (html version)
|
||||||
|
|||||||
@ -38,7 +38,7 @@
|
|||||||
# directory.
|
# directory.
|
||||||
# - open a terminal program and run these commands:
|
# - open a terminal program and run these commands:
|
||||||
# cd "${JDK_CHECKOUT}"/src/jdk.compiler/share/data/symbols
|
# cd "${JDK_CHECKOUT}"/src/jdk.compiler/share/data/symbols
|
||||||
# bash ../../../../../make/scripts/generate-symbol-data.sh "${JDK_N_INSTALL}"
|
# bash ../../../../../bin/generate-symbol-data.sh "${JDK_N_INSTALL}"
|
||||||
# - this command will generate or update data for "--release N" into the ${JDK_CHECKOUT}/src/jdk.compiler/share/data/symbols
|
# - this command will generate or update data for "--release N" into the ${JDK_CHECKOUT}/src/jdk.compiler/share/data/symbols
|
||||||
# directory, updating all registration necessary. If the goal was to update the data, and there are no
|
# directory, updating all registration necessary. If the goal was to update the data, and there are no
|
||||||
# new or changed files in the ${JDK_CHECKOUT}/src/jdk.compiler/share/data/symbols directory after running this script,
|
# new or changed files in the ${JDK_CHECKOUT}/src/jdk.compiler/share/data/symbols directory after running this script,
|
||||||
|
|||||||
@ -541,6 +541,11 @@ href="#apple-xcode">Apple Xcode</a> on some strategies to deal with
|
|||||||
this.</p>
|
this.</p>
|
||||||
<p>It is recommended that you use at least macOS 14 and Xcode 15.4, but
|
<p>It is recommended that you use at least macOS 14 and Xcode 15.4, but
|
||||||
earlier versions may also work.</p>
|
earlier versions may also work.</p>
|
||||||
|
<p>Starting with Xcode 26, introduced in macOS 26, the Metal toolchain
|
||||||
|
no longer comes bundled with Xcode, so it needs to be installed
|
||||||
|
separately. This can either be done via the Xcode's Settings/Components
|
||||||
|
UI, or in the command line calling
|
||||||
|
<code>xcodebuild -downloadComponent metalToolchain</code>.</p>
|
||||||
<p>The standard macOS environment contains the basic tooling needed to
|
<p>The standard macOS environment contains the basic tooling needed to
|
||||||
build, but for external libraries a package manager is recommended. The
|
build, but for external libraries a package manager is recommended. The
|
||||||
JDK uses <a href="https://brew.sh/">homebrew</a> in the examples, but
|
JDK uses <a href="https://brew.sh/">homebrew</a> in the examples, but
|
||||||
|
|||||||
@ -352,6 +352,11 @@ on some strategies to deal with this.
|
|||||||
It is recommended that you use at least macOS 14 and Xcode 15.4, but
|
It is recommended that you use at least macOS 14 and Xcode 15.4, but
|
||||||
earlier versions may also work.
|
earlier versions may also work.
|
||||||
|
|
||||||
|
Starting with Xcode 26, introduced in macOS 26, the Metal toolchain no longer
|
||||||
|
comes bundled with Xcode, so it needs to be installed separately. This can
|
||||||
|
either be done via the Xcode's Settings/Components UI, or in the command line
|
||||||
|
calling `xcodebuild -downloadComponent metalToolchain`.
|
||||||
|
|
||||||
The standard macOS environment contains the basic tooling needed to build, but
|
The standard macOS environment contains the basic tooling needed to build, but
|
||||||
for external libraries a package manager is recommended. The JDK uses
|
for external libraries a package manager is recommended. The JDK uses
|
||||||
[homebrew](https://brew.sh/) in the examples, but feel free to use whatever
|
[homebrew](https://brew.sh/) in the examples, but feel free to use whatever
|
||||||
|
|||||||
@ -1037,8 +1037,8 @@ running destructors at exit can lead to problems.</p>
|
|||||||
<p>Some of the approaches used in HotSpot to avoid dynamic
|
<p>Some of the approaches used in HotSpot to avoid dynamic
|
||||||
initialization include:</p>
|
initialization include:</p>
|
||||||
<ul>
|
<ul>
|
||||||
<li><p>Use the <code>Deferred<T></code> class template. Add a call
|
<li><p>Use the <code>DeferredStatic<T></code> class template. Add
|
||||||
to its initialization function at an appropriate place during VM
|
a call to its initialization function at an appropriate place during VM
|
||||||
initialization. The underlying object is never destroyed.</p></li>
|
initialization. The underlying object is never destroyed.</p></li>
|
||||||
<li><p>For objects of class type, use a variable whose value is a
|
<li><p>For objects of class type, use a variable whose value is a
|
||||||
pointer to the class, initialized to <code>nullptr</code>. Provide an
|
pointer to the class, initialized to <code>nullptr</code>. Provide an
|
||||||
|
|||||||
@ -954,7 +954,7 @@ destructors at exit can lead to problems.
|
|||||||
Some of the approaches used in HotSpot to avoid dynamic initialization
|
Some of the approaches used in HotSpot to avoid dynamic initialization
|
||||||
include:
|
include:
|
||||||
|
|
||||||
* Use the `Deferred<T>` class template. Add a call to its initialization
|
* Use the `DeferredStatic<T>` class template. Add a call to its initialization
|
||||||
function at an appropriate place during VM initialization. The underlying
|
function at an appropriate place during VM initialization. The underlying
|
||||||
object is never destroyed.
|
object is never destroyed.
|
||||||
|
|
||||||
|
|||||||
@ -119,6 +119,9 @@ cover the new source version</li>
|
|||||||
and
|
and
|
||||||
<code>test/langtools/tools/javac/preview/classReaderTest/Client.preview.out</code>:
|
<code>test/langtools/tools/javac/preview/classReaderTest/Client.preview.out</code>:
|
||||||
update expected messages for preview errors and warnings</li>
|
update expected messages for preview errors and warnings</li>
|
||||||
|
<li><code>test/langtools/tools/javac/versions/Versions.java</code>: add
|
||||||
|
new source version to the set of valid sources and add new enum constant
|
||||||
|
for the new class file version.</li>
|
||||||
</ul>
|
</ul>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@ -65,4 +65,4 @@ to be updated for a particular release.
|
|||||||
* `test/langtools/tools/javac/lib/JavacTestingAbstractProcessor.java`
|
* `test/langtools/tools/javac/lib/JavacTestingAbstractProcessor.java`
|
||||||
update annotation processor extended by `javac` tests to cover the new source version
|
update annotation processor extended by `javac` tests to cover the new source version
|
||||||
* `test/langtools/tools/javac/preview/classReaderTest/Client.nopreview.out` and `test/langtools/tools/javac/preview/classReaderTest/Client.preview.out`: update expected messages for preview errors and warnings
|
* `test/langtools/tools/javac/preview/classReaderTest/Client.nopreview.out` and `test/langtools/tools/javac/preview/classReaderTest/Client.preview.out`: update expected messages for preview errors and warnings
|
||||||
|
* `test/langtools/tools/javac/versions/Versions.java`: add new source version to the set of valid sources and add new enum constant for the new class file version.
|
||||||
|
|||||||
@ -125,13 +125,6 @@ define SetupBundleFileBody
|
|||||||
&& $(TAR) cf - -$(TAR_INCLUDE_PARAM) $$($1_$$d_LIST_FILE) \
|
&& $(TAR) cf - -$(TAR_INCLUDE_PARAM) $$($1_$$d_LIST_FILE) \
|
||||||
$(TAR_IGNORE_EXIT_VALUE) ) \
|
$(TAR_IGNORE_EXIT_VALUE) ) \
|
||||||
| ( $(CD) $(SUPPORT_OUTPUTDIR)/bundles/$1/$$($1_SUBDIR) && $(TAR) xf - )$$(NEWLINE) )
|
| ( $(CD) $(SUPPORT_OUTPUTDIR)/bundles/$1/$$($1_SUBDIR) && $(TAR) xf - )$$(NEWLINE) )
|
||||||
# Rename stripped pdb files
|
|
||||||
ifeq ($(call isTargetOs, windows)+$(SHIP_DEBUG_SYMBOLS), true+public)
|
|
||||||
for f in `$(FIND) $(SUPPORT_OUTPUTDIR)/bundles/$1/$$($1_SUBDIR) -name "*.stripped.pdb"`; do \
|
|
||||||
$(ECHO) Renaming $$$${f} to $$$${f%stripped.pdb}pdb $(LOG_INFO); \
|
|
||||||
$(MV) $$$${f} $$$${f%stripped.pdb}pdb; \
|
|
||||||
done
|
|
||||||
endif
|
|
||||||
# Unzip any zipped debuginfo files
|
# Unzip any zipped debuginfo files
|
||||||
ifeq ($$($1_UNZIP_DEBUGINFO), true)
|
ifeq ($$($1_UNZIP_DEBUGINFO), true)
|
||||||
for f in `$(FIND) $(SUPPORT_OUTPUTDIR)/bundles/$1/$$($1_SUBDIR) -name "*.diz"`; do \
|
for f in `$(FIND) $(SUPPORT_OUTPUTDIR)/bundles/$1/$$($1_SUBDIR) -name "*.diz"`; do \
|
||||||
@ -192,96 +185,30 @@ endif
|
|||||||
|
|
||||||
ifneq ($(filter product-bundles% legacy-bundles, $(MAKECMDGOALS)), )
|
ifneq ($(filter product-bundles% legacy-bundles, $(MAKECMDGOALS)), )
|
||||||
|
|
||||||
SYMBOLS_EXCLUDE_PATTERN := %.debuginfo %.diz %.map
|
# There may be files with spaces in the names, so use ShellFindFiles explicitly.
|
||||||
|
|
||||||
# There may be files with spaces in the names, so use ShellFindFiles
|
|
||||||
# explicitly.
|
|
||||||
ALL_JDK_FILES := $(call ShellFindFiles, $(JDK_IMAGE_DIR))
|
ALL_JDK_FILES := $(call ShellFindFiles, $(JDK_IMAGE_DIR))
|
||||||
ifneq ($(JDK_IMAGE_DIR), $(JDK_SYMBOLS_IMAGE_DIR))
|
|
||||||
ALL_JDK_SYMBOLS_FILES := $(call ShellFindFiles, $(JDK_SYMBOLS_IMAGE_DIR))
|
|
||||||
else
|
|
||||||
ALL_JDK_SYMBOLS_FILES := $(ALL_JDK_FILES)
|
|
||||||
endif
|
|
||||||
ifneq ($(JDK_IMAGE_DIR), $(JDK_DEMOS_IMAGE_DIR))
|
ifneq ($(JDK_IMAGE_DIR), $(JDK_DEMOS_IMAGE_DIR))
|
||||||
ALL_JDK_DEMOS_FILES := $(call ShellFindFiles, $(JDK_DEMOS_IMAGE_DIR))
|
ALL_JDK_DEMOS_FILES := $(call ShellFindFiles, $(JDK_DEMOS_IMAGE_DIR))
|
||||||
else
|
else
|
||||||
ALL_JDK_DEMOS_FILES := $(ALL_JDK_FILES)
|
ALL_JDK_DEMOS_FILES := $(ALL_JDK_FILES)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Create special filter rules when dealing with unzipped .dSYM directories on
|
|
||||||
# macosx
|
|
||||||
ifeq ($(call isTargetOs, macosx), true)
|
|
||||||
ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), false)
|
|
||||||
JDK_SYMBOLS_EXCLUDE_PATTERN := $(addprefix %, \
|
|
||||||
$(call containing, .dSYM/, $(patsubst $(JDK_IMAGE_DIR)/%, %, \
|
|
||||||
$(ALL_JDK_SYMBOLS_FILES))))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Create special filter rules when dealing with debug symbols on windows
|
|
||||||
ifeq ($(call isTargetOs, windows), true)
|
|
||||||
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
|
||||||
JDK_SYMBOLS_EXCLUDE_PATTERN := %.pdb
|
|
||||||
else
|
|
||||||
ifeq ($(SHIP_DEBUG_SYMBOLS), public)
|
|
||||||
JDK_SYMBOLS_EXCLUDE_PATTERN := \
|
|
||||||
$(filter-out \
|
|
||||||
%.stripped.pdb, \
|
|
||||||
$(filter %.pdb, $(ALL_JDK_FILES)) \
|
|
||||||
)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
JDK_BUNDLE_FILES := \
|
JDK_BUNDLE_FILES := \
|
||||||
$(filter-out \
|
$(filter-out \
|
||||||
$(JDK_SYMBOLS_EXCLUDE_PATTERN) \
|
|
||||||
$(JDK_EXTRA_EXCLUDES) \
|
$(JDK_EXTRA_EXCLUDES) \
|
||||||
$(SYMBOLS_EXCLUDE_PATTERN) \
|
|
||||||
$(JDK_IMAGE_HOMEDIR)/demo/% \
|
$(JDK_IMAGE_HOMEDIR)/demo/% \
|
||||||
, \
|
, \
|
||||||
$(ALL_JDK_FILES) \
|
$(ALL_JDK_FILES) \
|
||||||
)
|
)
|
||||||
|
|
||||||
JDK_SYMBOLS_BUNDLE_FILES := \
|
JDK_SYMBOLS_BUNDLE_FILES := $(call FindFiles, $(SYMBOLS_IMAGE_DIR))
|
||||||
$(filter-out \
|
|
||||||
%.stripped.pdb, \
|
|
||||||
$(call FindFiles, $(SYMBOLS_IMAGE_DIR)) \
|
|
||||||
)
|
|
||||||
|
|
||||||
TEST_DEMOS_BUNDLE_FILES := $(filter $(JDK_DEMOS_IMAGE_HOMEDIR)/demo/%, \
|
TEST_DEMOS_BUNDLE_FILES := $(filter $(JDK_DEMOS_IMAGE_HOMEDIR)/demo/%, \
|
||||||
$(ALL_JDK_DEMOS_FILES))
|
$(ALL_JDK_DEMOS_FILES))
|
||||||
|
|
||||||
ALL_JRE_FILES := $(call ShellFindFiles, $(JRE_IMAGE_DIR))
|
ALL_JRE_FILES := $(call ShellFindFiles, $(JRE_IMAGE_DIR))
|
||||||
|
|
||||||
# Create special filter rules when dealing with unzipped .dSYM directories on
|
JRE_BUNDLE_FILES := $(ALL_JRE_FILES)
|
||||||
# macosx
|
|
||||||
ifeq ($(OPENJDK_TARGET_OS), macosx)
|
|
||||||
ifeq ($(ZIP_EXTERNAL_DEBUG_SYMBOLS), false)
|
|
||||||
JRE_SYMBOLS_EXCLUDE_PATTERN := $(addprefix %, \
|
|
||||||
$(call containing, .dSYM/, $(patsubst $(JRE_IMAGE_DIR)/%, %, $(ALL_JRE_FILES))))
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Create special filter rules when dealing with debug symbols on windows
|
|
||||||
ifeq ($(call isTargetOs, windows), true)
|
|
||||||
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
|
||||||
JRE_SYMBOLS_EXCLUDE_PATTERN := %.pdb
|
|
||||||
else
|
|
||||||
ifeq ($(SHIP_DEBUG_SYMBOLS), public)
|
|
||||||
JRE_SYMBOLS_EXCLUDE_PATTERN := \
|
|
||||||
$(filter-out \
|
|
||||||
%.stripped.pdb, \
|
|
||||||
$(filter %.pdb, $(ALL_JRE_FILES)) \
|
|
||||||
)
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
endif
|
|
||||||
|
|
||||||
JRE_BUNDLE_FILES := $(filter-out \
|
|
||||||
$(JRE_SYMBOLS_EXCLUDE_PATTERN) \
|
|
||||||
$(SYMBOLS_EXCLUDE_PATTERN), \
|
|
||||||
$(ALL_JRE_FILES))
|
|
||||||
|
|
||||||
ifeq ($(MACOSX_CODESIGN_MODE), hardened)
|
ifeq ($(MACOSX_CODESIGN_MODE), hardened)
|
||||||
# Macosx release build and code signing available.
|
# Macosx release build and code signing available.
|
||||||
|
|||||||
@ -218,10 +218,14 @@ ifeq ($(call isTargetOs, windows), true)
|
|||||||
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
||||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.pdb,*.map}'
|
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.pdb,*.map}'
|
||||||
else
|
else
|
||||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.map}'
|
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.map}'
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.debuginfo,*.dSYM/**,*.dSYM}'
|
ifeq ($(SHIP_DEBUG_SYMBOLS), )
|
||||||
|
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*,*.diz,*.debuginfo,*.dSYM/**,*.dSYM}'
|
||||||
|
else
|
||||||
|
JMOD_FLAGS += --exclude '**{_the.*,_*.marker*}'
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Unless we are creating a very large module, use the small tool JVM options
|
# Unless we are creating a very large module, use the small tool JVM options
|
||||||
|
|||||||
@ -93,16 +93,19 @@ JAVADOC_DISABLED_DOCLINT_WARNINGS := missing
|
|||||||
JAVADOC_DISABLED_DOCLINT_PACKAGES := org.w3c.* javax.smartcardio
|
JAVADOC_DISABLED_DOCLINT_PACKAGES := org.w3c.* javax.smartcardio
|
||||||
|
|
||||||
# The initial set of options for javadoc
|
# The initial set of options for javadoc
|
||||||
|
# -XDaccessInternalAPI is a temporary workaround, see 8373909
|
||||||
JAVADOC_OPTIONS := -use -keywords -notimestamp \
|
JAVADOC_OPTIONS := -use -keywords -notimestamp \
|
||||||
-serialwarn -encoding utf-8 -docencoding utf-8 -breakiterator \
|
-serialwarn -encoding utf-8 -docencoding utf-8 -breakiterator \
|
||||||
-splitIndex --system none -javafx --expand-requires transitive \
|
-splitIndex --system none -javafx --expand-requires transitive \
|
||||||
--override-methods=summary
|
--override-methods=summary \
|
||||||
|
-XDaccessInternalAPI
|
||||||
|
|
||||||
# The reference options must stay stable to allow for comparisons across the
|
# The reference options must stay stable to allow for comparisons across the
|
||||||
# development cycle.
|
# development cycle.
|
||||||
REFERENCE_OPTIONS := -XDignore.symbol.file=true -use -keywords -notimestamp \
|
REFERENCE_OPTIONS := -XDignore.symbol.file=true -use -keywords -notimestamp \
|
||||||
-serialwarn -encoding utf-8 -breakiterator -splitIndex --system none \
|
-serialwarn -encoding utf-8 -breakiterator -splitIndex --system none \
|
||||||
-html5 -javafx --expand-requires transitive
|
-html5 -javafx --expand-requires transitive \
|
||||||
|
-XDaccessInternalAPI
|
||||||
|
|
||||||
# Should we add DRAFT stamps to the generated javadoc?
|
# Should we add DRAFT stamps to the generated javadoc?
|
||||||
ifeq ($(VERSION_IS_GA), true)
|
ifeq ($(VERSION_IS_GA), true)
|
||||||
|
|||||||
@ -282,29 +282,33 @@ else
|
|||||||
endif
|
endif
|
||||||
CMDS_TARGET_SUBDIR := bin
|
CMDS_TARGET_SUBDIR := bin
|
||||||
|
|
||||||
# Param 1 - either JDK or JRE
|
# Copy debug info files into symbols bundle.
|
||||||
|
# In case of Windows and --with-external-symbols-in-bundles=public, take care to remove *.stripped.pdb files
|
||||||
SetupCopyDebuginfo = \
|
SetupCopyDebuginfo = \
|
||||||
$(foreach m, $(ALL_$1_MODULES), \
|
$(foreach m, $(ALL_$1_MODULES), \
|
||||||
|
$(eval dbgfiles := $(call FindDebuginfoFiles, $(SUPPORT_OUTPUTDIR)/modules_libs/$m)) \
|
||||||
|
$(eval dbgfiles := $(if $(filter true+public,$(call isTargetOs,windows)+$(SHIP_DEBUG_SYMBOLS)), \
|
||||||
|
$(filter-out %.stripped.pdb,$(dbgfiles)),$(dbgfiles)) \
|
||||||
|
) \
|
||||||
$(eval $(call SetupCopyFiles, COPY_$1_LIBS_DEBUGINFO_$m, \
|
$(eval $(call SetupCopyFiles, COPY_$1_LIBS_DEBUGINFO_$m, \
|
||||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/$m, \
|
SRC := $(SUPPORT_OUTPUTDIR)/modules_libs/$m, \
|
||||||
DEST := $($1_IMAGE_DIR)/$(LIBS_TARGET_SUBDIR), \
|
DEST := $($1_IMAGE_DIR)/$(LIBS_TARGET_SUBDIR), \
|
||||||
FILES := $(call FindDebuginfoFiles, \
|
FILES := $(dbgfiles), \
|
||||||
$(SUPPORT_OUTPUTDIR)/modules_libs/$m), \
|
|
||||||
)) \
|
)) \
|
||||||
$(eval $1_TARGETS += $$(COPY_$1_LIBS_DEBUGINFO_$m)) \
|
$(eval $1_TARGETS += $$(COPY_$1_LIBS_DEBUGINFO_$m)) \
|
||||||
|
$(eval dbgfiles := $(call FindDebuginfoFiles, $(SUPPORT_OUTPUTDIR)/modules_cmds/$m)) \
|
||||||
|
$(eval dbgfiles := $(if $(filter true+public,$(call isTargetOs,windows)+$(SHIP_DEBUG_SYMBOLS)), \
|
||||||
|
$(filter-out %.stripped.pdb,$(dbgfiles)),$(dbgfiles)) \
|
||||||
|
) \
|
||||||
$(eval $(call SetupCopyFiles, COPY_$1_CMDS_DEBUGINFO_$m, \
|
$(eval $(call SetupCopyFiles, COPY_$1_CMDS_DEBUGINFO_$m, \
|
||||||
SRC := $(SUPPORT_OUTPUTDIR)/modules_cmds/$m, \
|
SRC := $(SUPPORT_OUTPUTDIR)/modules_cmds/$m, \
|
||||||
DEST := $($1_IMAGE_DIR)/$(CMDS_TARGET_SUBDIR), \
|
DEST := $($1_IMAGE_DIR)/$(CMDS_TARGET_SUBDIR), \
|
||||||
FILES := $(call FindDebuginfoFiles, \
|
FILES := $(dbgfiles), \
|
||||||
$(SUPPORT_OUTPUTDIR)/modules_cmds/$m), \
|
|
||||||
)) \
|
)) \
|
||||||
$(eval $1_TARGETS += $$(COPY_$1_CMDS_DEBUGINFO_$m)) \
|
$(eval $1_TARGETS += $$(COPY_$1_CMDS_DEBUGINFO_$m)) \
|
||||||
)
|
)
|
||||||
|
|
||||||
# No space before argument to avoid having to put $(strip ) everywhere in
|
# No space before argument to avoid having to put $(strip ) everywhere in implementation above.
|
||||||
# implementation above.
|
|
||||||
$(call SetupCopyDebuginfo,JDK)
|
|
||||||
$(call SetupCopyDebuginfo,JRE)
|
|
||||||
$(call SetupCopyDebuginfo,SYMBOLS)
|
$(call SetupCopyDebuginfo,SYMBOLS)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|||||||
@ -873,7 +873,7 @@ define SetupRunJtregTestBody
|
|||||||
$1_JTREG_BASIC_OPTIONS += -testThreadFactoryPath:$$(JTREG_TEST_THREAD_FACTORY_JAR)
|
$1_JTREG_BASIC_OPTIONS += -testThreadFactoryPath:$$(JTREG_TEST_THREAD_FACTORY_JAR)
|
||||||
$1_JTREG_BASIC_OPTIONS += -testThreadFactory:$$(JTREG_TEST_THREAD_FACTORY)
|
$1_JTREG_BASIC_OPTIONS += -testThreadFactory:$$(JTREG_TEST_THREAD_FACTORY)
|
||||||
$1_JTREG_BASIC_OPTIONS += $$(addprefix $$(JTREG_PROBLEM_LIST_PREFIX), $$(wildcard \
|
$1_JTREG_BASIC_OPTIONS += $$(addprefix $$(JTREG_PROBLEM_LIST_PREFIX), $$(wildcard \
|
||||||
$$(addprefix $$($1_TEST_ROOT)/, ProblemList-$$(JTREG_TEST_THREAD_FACTORY).txt) \
|
$$(addprefix $$($1_TEST_ROOT)/, ProblemList-$$(JTREG_TEST_THREAD_FACTORY).txt) \
|
||||||
))
|
))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -881,8 +881,8 @@ define SetupRunJtregTestBody
|
|||||||
AGENT := $$(LIBRARY_PREFIX)JvmtiStressAgent$$(SHARED_LIBRARY_SUFFIX)=$$(JTREG_JVMTI_STRESS_AGENT)
|
AGENT := $$(LIBRARY_PREFIX)JvmtiStressAgent$$(SHARED_LIBRARY_SUFFIX)=$$(JTREG_JVMTI_STRESS_AGENT)
|
||||||
$1_JTREG_BASIC_OPTIONS += -javaoption:'-agentpath:$(TEST_IMAGE_DIR)/hotspot/jtreg/native/$$(AGENT)'
|
$1_JTREG_BASIC_OPTIONS += -javaoption:'-agentpath:$(TEST_IMAGE_DIR)/hotspot/jtreg/native/$$(AGENT)'
|
||||||
$1_JTREG_BASIC_OPTIONS += $$(addprefix $$(JTREG_PROBLEM_LIST_PREFIX), $$(wildcard \
|
$1_JTREG_BASIC_OPTIONS += $$(addprefix $$(JTREG_PROBLEM_LIST_PREFIX), $$(wildcard \
|
||||||
$$(addprefix $$($1_TEST_ROOT)/, ProblemList-jvmti-stress-agent.txt) \
|
$$(addprefix $$($1_TEST_ROOT)/, ProblemList-jvmti-stress-agent.txt) \
|
||||||
))
|
))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
@ -1092,7 +1092,7 @@ define SetupRunJtregTestBody
|
|||||||
$$(call MakeDir, $$($1_TEST_RESULTS_DIR) $$($1_TEST_SUPPORT_DIR) \
|
$$(call MakeDir, $$($1_TEST_RESULTS_DIR) $$($1_TEST_SUPPORT_DIR) \
|
||||||
$$($1_TEST_TMP_DIR))
|
$$($1_TEST_TMP_DIR))
|
||||||
$$(call ExecuteWithLog, $$($1_TEST_SUPPORT_DIR)/jtreg, \
|
$$(call ExecuteWithLog, $$($1_TEST_SUPPORT_DIR)/jtreg, \
|
||||||
$$(COV_ENVIRONMENT) $$($1_COMMAND_LINE) \
|
$$(COV_ENVIRONMENT) $$($1_COMMAND_LINE) \
|
||||||
)
|
)
|
||||||
|
|
||||||
$1_RESULT_FILE := $$($1_TEST_RESULTS_DIR)/text/stats.txt
|
$1_RESULT_FILE := $$($1_TEST_RESULTS_DIR)/text/stats.txt
|
||||||
@ -1102,11 +1102,11 @@ define SetupRunJtregTestBody
|
|||||||
$$(call LogWarn, Test report is stored in $$(strip \
|
$$(call LogWarn, Test report is stored in $$(strip \
|
||||||
$$(subst $$(TOPDIR)/, , $$($1_TEST_RESULTS_DIR))))
|
$$(subst $$(TOPDIR)/, , $$($1_TEST_RESULTS_DIR))))
|
||||||
|
|
||||||
# Read jtreg documentation to learn on the test stats categories:
|
# Read jtreg documentation to learn on the test stats categories:
|
||||||
# https://github.com/openjdk/jtreg/blob/master/src/share/doc/javatest/regtest/faq.md#what-do-all-those-numbers-in-the-test-results-line-mean
|
# https://github.com/openjdk/jtreg/blob/master/src/share/doc/javatest/regtest/faq.md#what-do-all-those-numbers-in-the-test-results-line-mean
|
||||||
# In jtreg, "skipped:" category accounts for tests that threw jtreg.SkippedException at runtime.
|
# In jtreg, "skipped:" category accounts for tests that threw jtreg.SkippedException at runtime.
|
||||||
# At the same time these tests contribute to "passed:" tests.
|
# At the same time these tests contribute to "passed:" tests.
|
||||||
# In here we don't want that and so we substract number of "skipped:" from "passed:".
|
# In here we don't want that and so we substract number of "skipped:" from "passed:".
|
||||||
|
|
||||||
$$(if $$(wildcard $$($1_RESULT_FILE)), \
|
$$(if $$(wildcard $$($1_RESULT_FILE)), \
|
||||||
$$(eval $1_PASSED_AND_RUNTIME_SKIPPED := $$(shell $$(AWK) '{ gsub(/[,;]/, ""); \
|
$$(eval $1_PASSED_AND_RUNTIME_SKIPPED := $$(shell $$(AWK) '{ gsub(/[,;]/, ""); \
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -79,7 +79,7 @@ TOOL_GENERATEEXTRAPROPERTIES = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_too
|
|||||||
build.tools.generateextraproperties.GenerateExtraProperties
|
build.tools.generateextraproperties.GenerateExtraProperties
|
||||||
|
|
||||||
TOOL_GENERATECASEFOLDING = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
TOOL_GENERATECASEFOLDING = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
||||||
build.tools.generatecharacter.CaseFolding
|
build.tools.generatecharacter.GenerateCaseFolding
|
||||||
|
|
||||||
TOOL_MAKEZIPREPRODUCIBLE = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
TOOL_MAKEZIPREPRODUCIBLE = $(JAVA_SMALL) -cp $(BUILDTOOLS_OUTPUTDIR)/jdk_tools_classes \
|
||||||
build.tools.makezipreproducible.MakeZipReproducible
|
build.tools.makezipreproducible.MakeZipReproducible
|
||||||
|
|||||||
@ -353,7 +353,12 @@ AC_DEFUN_ONCE([BASIC_SETUP_DEVKIT],
|
|||||||
[set up toolchain on Mac OS using a path to an Xcode installation])])
|
[set up toolchain on Mac OS using a path to an Xcode installation])])
|
||||||
|
|
||||||
UTIL_DEPRECATED_ARG_WITH(sys-root)
|
UTIL_DEPRECATED_ARG_WITH(sys-root)
|
||||||
UTIL_DEPRECATED_ARG_WITH(tools-dir)
|
|
||||||
|
AC_ARG_WITH([tools-dir], [AS_HELP_STRING([--with-tools-dir],
|
||||||
|
[Point to a nonstandard Visual Studio installation location on Windows by
|
||||||
|
specifying any existing directory 2 or 3 levels below the installation
|
||||||
|
root.])]
|
||||||
|
)
|
||||||
|
|
||||||
if test "x$with_xcode_path" != x; then
|
if test "x$with_xcode_path" != x; then
|
||||||
if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
|
if test "x$OPENJDK_BUILD_OS" = "xmacosx"; then
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2015, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -69,6 +69,23 @@ AC_DEFUN([FLAGS_SETUP_DEBUG_SYMBOLS],
|
|||||||
# Debug prefix mapping if supported by compiler
|
# Debug prefix mapping if supported by compiler
|
||||||
DEBUG_PREFIX_CFLAGS=
|
DEBUG_PREFIX_CFLAGS=
|
||||||
|
|
||||||
|
UTIL_ARG_WITH(NAME: native-debug-symbols-level, TYPE: string,
|
||||||
|
DEFAULT: "",
|
||||||
|
RESULT: DEBUG_SYMBOLS_LEVEL,
|
||||||
|
DESC: [set the native debug symbol level (GCC and Clang only)],
|
||||||
|
DEFAULT_DESC: [toolchain default])
|
||||||
|
AC_SUBST(DEBUG_SYMBOLS_LEVEL)
|
||||||
|
|
||||||
|
if test "x${TOOLCHAIN_TYPE}" = xgcc || \
|
||||||
|
test "x${TOOLCHAIN_TYPE}" = xclang; then
|
||||||
|
DEBUG_SYMBOLS_LEVEL_FLAGS="-g"
|
||||||
|
if test "x${DEBUG_SYMBOLS_LEVEL}" != "x"; then
|
||||||
|
DEBUG_SYMBOLS_LEVEL_FLAGS="-g${DEBUG_SYMBOLS_LEVEL}"
|
||||||
|
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [${DEBUG_SYMBOLS_LEVEL_FLAGS}],
|
||||||
|
IF_FALSE: AC_MSG_ERROR("Debug info level ${DEBUG_SYMBOLS_LEVEL} is not supported"))
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Debug symbols
|
# Debug symbols
|
||||||
if test "x$TOOLCHAIN_TYPE" = xgcc; then
|
if test "x$TOOLCHAIN_TYPE" = xgcc; then
|
||||||
if test "x$ALLOW_ABSOLUTE_PATHS_IN_OUTPUT" = "xfalse"; then
|
if test "x$ALLOW_ABSOLUTE_PATHS_IN_OUTPUT" = "xfalse"; then
|
||||||
@ -93,8 +110,9 @@ AC_DEFUN([FLAGS_SETUP_DEBUG_SYMBOLS],
|
|||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
CFLAGS_DEBUG_SYMBOLS="-g -gdwarf-4"
|
# Debug info level should follow the debug format to be effective.
|
||||||
ASFLAGS_DEBUG_SYMBOLS="-g"
|
CFLAGS_DEBUG_SYMBOLS="-gdwarf-4 ${DEBUG_SYMBOLS_LEVEL_FLAGS}"
|
||||||
|
ASFLAGS_DEBUG_SYMBOLS="${DEBUG_SYMBOLS_LEVEL_FLAGS}"
|
||||||
elif test "x$TOOLCHAIN_TYPE" = xclang; then
|
elif test "x$TOOLCHAIN_TYPE" = xclang; then
|
||||||
if test "x$ALLOW_ABSOLUTE_PATHS_IN_OUTPUT" = "xfalse"; then
|
if test "x$ALLOW_ABSOLUTE_PATHS_IN_OUTPUT" = "xfalse"; then
|
||||||
# Check if compiler supports -fdebug-prefix-map. If so, use that to make
|
# Check if compiler supports -fdebug-prefix-map. If so, use that to make
|
||||||
@ -113,8 +131,9 @@ AC_DEFUN([FLAGS_SETUP_DEBUG_SYMBOLS],
|
|||||||
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [${GDWARF_FLAGS}],
|
FLAGS_COMPILER_CHECK_ARGUMENTS(ARGUMENT: [${GDWARF_FLAGS}],
|
||||||
IF_FALSE: [GDWARF_FLAGS=""])
|
IF_FALSE: [GDWARF_FLAGS=""])
|
||||||
|
|
||||||
CFLAGS_DEBUG_SYMBOLS="-g ${GDWARF_FLAGS}"
|
# Debug info level should follow the debug format to be effective.
|
||||||
ASFLAGS_DEBUG_SYMBOLS="-g"
|
CFLAGS_DEBUG_SYMBOLS="${GDWARF_FLAGS} ${DEBUG_SYMBOLS_LEVEL_FLAGS}"
|
||||||
|
ASFLAGS_DEBUG_SYMBOLS="${DEBUG_SYMBOLS_LEVEL_FLAGS}"
|
||||||
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
|
elif test "x$TOOLCHAIN_TYPE" = xmicrosoft; then
|
||||||
CFLAGS_DEBUG_SYMBOLS="-Z7"
|
CFLAGS_DEBUG_SYMBOLS="-Z7"
|
||||||
fi
|
fi
|
||||||
|
|||||||
@ -34,7 +34,7 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS],
|
|||||||
FLAGS_SETUP_LDFLAGS_CPU_DEP([TARGET])
|
FLAGS_SETUP_LDFLAGS_CPU_DEP([TARGET])
|
||||||
|
|
||||||
# Setup the build toolchain
|
# Setup the build toolchain
|
||||||
FLAGS_SETUP_LDFLAGS_CPU_DEP([BUILD], [OPENJDK_BUILD_])
|
FLAGS_SETUP_LDFLAGS_CPU_DEP([BUILD], [OPENJDK_BUILD_], [BUILD_])
|
||||||
|
|
||||||
AC_SUBST(ADLC_LDFLAGS)
|
AC_SUBST(ADLC_LDFLAGS)
|
||||||
])
|
])
|
||||||
@ -50,7 +50,9 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
|||||||
# add -z,relro (mark relocations read only) for all libs
|
# add -z,relro (mark relocations read only) for all libs
|
||||||
# add -z,now ("full relro" - more of the Global Offset Table GOT is marked read only)
|
# add -z,now ("full relro" - more of the Global Offset Table GOT is marked read only)
|
||||||
# add --no-as-needed to disable default --as-needed link flag on some GCC toolchains
|
# add --no-as-needed to disable default --as-needed link flag on some GCC toolchains
|
||||||
|
# add --icf=all (Identical Code Folding — merges identical functions)
|
||||||
BASIC_LDFLAGS="-Wl,-z,defs -Wl,-z,relro -Wl,-z,now -Wl,--no-as-needed -Wl,--exclude-libs,ALL"
|
BASIC_LDFLAGS="-Wl,-z,defs -Wl,-z,relro -Wl,-z,now -Wl,--no-as-needed -Wl,--exclude-libs,ALL"
|
||||||
|
|
||||||
# Linux : remove unused code+data in link step
|
# Linux : remove unused code+data in link step
|
||||||
if test "x$ENABLE_LINKTIME_GC" = xtrue; then
|
if test "x$ENABLE_LINKTIME_GC" = xtrue; then
|
||||||
if test "x$OPENJDK_TARGET_CPU" = xs390x; then
|
if test "x$OPENJDK_TARGET_CPU" = xs390x; then
|
||||||
@ -61,7 +63,7 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
BASIC_LDFLAGS_JVM_ONLY=""
|
BASIC_LDFLAGS_JVM_ONLY=""
|
||||||
LDFLAGS_LTO="-flto=auto -fuse-linker-plugin -fno-strict-aliasing"
|
LDFLAGS_LTO="-flto=auto -fuse-linker-plugin -fno-strict-aliasing $DEBUG_PREFIX_CFLAGS"
|
||||||
|
|
||||||
LDFLAGS_CXX_PARTIAL_LINKING="$MACHINE_FLAG -r"
|
LDFLAGS_CXX_PARTIAL_LINKING="$MACHINE_FLAG -r"
|
||||||
|
|
||||||
@ -69,7 +71,7 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
|||||||
BASIC_LDFLAGS_JVM_ONLY="-mno-omit-leaf-frame-pointer -mstack-alignment=16 \
|
BASIC_LDFLAGS_JVM_ONLY="-mno-omit-leaf-frame-pointer -mstack-alignment=16 \
|
||||||
-fPIC"
|
-fPIC"
|
||||||
|
|
||||||
LDFLAGS_LTO="-flto=auto -fuse-linker-plugin -fno-strict-aliasing"
|
LDFLAGS_LTO="-flto=auto -fuse-linker-plugin -fno-strict-aliasing $DEBUG_PREFIX_CFLAGS"
|
||||||
LDFLAGS_CXX_PARTIAL_LINKING="$MACHINE_FLAG -r"
|
LDFLAGS_CXX_PARTIAL_LINKING="$MACHINE_FLAG -r"
|
||||||
|
|
||||||
if test "x$OPENJDK_TARGET_OS" = xlinux; then
|
if test "x$OPENJDK_TARGET_OS" = xlinux; then
|
||||||
@ -101,6 +103,9 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
|||||||
|
|
||||||
# Setup OS-dependent LDFLAGS
|
# Setup OS-dependent LDFLAGS
|
||||||
if test "x$OPENJDK_TARGET_OS" = xmacosx && test "x$TOOLCHAIN_TYPE" = xclang; then
|
if test "x$OPENJDK_TARGET_OS" = xmacosx && test "x$TOOLCHAIN_TYPE" = xclang; then
|
||||||
|
if test x$DEBUG_LEVEL = xrelease; then
|
||||||
|
BASIC_LDFLAGS_JDK_ONLY="$BASIC_LDFLAGS_JDK_ONLY -Wl,-dead_strip"
|
||||||
|
fi
|
||||||
# FIXME: We should really generalize SetSharedLibraryOrigin instead.
|
# FIXME: We should really generalize SetSharedLibraryOrigin instead.
|
||||||
OS_LDFLAGS_JVM_ONLY="-Wl,-rpath,@loader_path/. -Wl,-rpath,@loader_path/.."
|
OS_LDFLAGS_JVM_ONLY="-Wl,-rpath,@loader_path/. -Wl,-rpath,@loader_path/.."
|
||||||
OS_LDFLAGS="-mmacosx-version-min=$MACOSX_VERSION_MIN -Wl,-reproducible"
|
OS_LDFLAGS="-mmacosx-version-min=$MACOSX_VERSION_MIN -Wl,-reproducible"
|
||||||
@ -159,7 +164,8 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_HELPER],
|
|||||||
################################################################################
|
################################################################################
|
||||||
# $1 - Either BUILD or TARGET to pick the correct OS/CPU variables to check
|
# $1 - Either BUILD or TARGET to pick the correct OS/CPU variables to check
|
||||||
# conditionals against.
|
# conditionals against.
|
||||||
# $2 - Optional prefix for each variable defined.
|
# $2 - Optional prefix for each variable defined (OPENJDK_BUILD_ or nothing).
|
||||||
|
# $3 - Optional prefix for toolchain variables (BUILD_ or nothing).
|
||||||
AC_DEFUN([FLAGS_SETUP_LDFLAGS_CPU_DEP],
|
AC_DEFUN([FLAGS_SETUP_LDFLAGS_CPU_DEP],
|
||||||
[
|
[
|
||||||
# Setup CPU-dependent basic LDFLAGS. These can differ between the target and
|
# Setup CPU-dependent basic LDFLAGS. These can differ between the target and
|
||||||
@ -193,6 +199,12 @@ AC_DEFUN([FLAGS_SETUP_LDFLAGS_CPU_DEP],
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if test "x${$3LD_TYPE}" = "xgold"; then
|
||||||
|
if test x$DEBUG_LEVEL = xrelease; then
|
||||||
|
$1_CPU_LDFLAGS="${$1_CPU_LDFLAGS} -Wl,--icf=all"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# Export variables according to old definitions, prefix with $2 if present.
|
# Export variables according to old definitions, prefix with $2 if present.
|
||||||
LDFLAGS_JDK_COMMON="$BASIC_LDFLAGS $BASIC_LDFLAGS_JDK_ONLY \
|
LDFLAGS_JDK_COMMON="$BASIC_LDFLAGS $BASIC_LDFLAGS_JDK_ONLY \
|
||||||
$OS_LDFLAGS $DEBUGLEVEL_LDFLAGS_JDK_ONLY ${$2EXTRA_LDFLAGS}"
|
$OS_LDFLAGS $DEBUGLEVEL_LDFLAGS_JDK_ONLY ${$2EXTRA_LDFLAGS}"
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -316,23 +316,36 @@ AC_DEFUN_ONCE([JDKOPT_SETUP_DEBUG_SYMBOLS],
|
|||||||
AC_MSG_CHECKING([if we should add external native debug symbols to the shipped bundles])
|
AC_MSG_CHECKING([if we should add external native debug symbols to the shipped bundles])
|
||||||
AC_ARG_WITH([external-symbols-in-bundles],
|
AC_ARG_WITH([external-symbols-in-bundles],
|
||||||
[AS_HELP_STRING([--with-external-symbols-in-bundles],
|
[AS_HELP_STRING([--with-external-symbols-in-bundles],
|
||||||
[which type of external native debug symbol information shall be shipped in product bundles (none, public, full)
|
[which type of external native debug symbol information shall be shipped with bundles/images (none, public, full).
|
||||||
(e.g. ship full/stripped pdbs on Windows) @<:@none@:>@])])
|
@<:@none in release builds, full otherwise. --with-native-debug-symbols=external/zipped is a prerequisite. public is only supported on Windows@:>@])],
|
||||||
|
[],
|
||||||
|
[with_external_symbols_in_bundles=default])
|
||||||
|
|
||||||
if test "x$with_external_symbols_in_bundles" = x || test "x$with_external_symbols_in_bundles" = xnone ; then
|
if test "x$with_external_symbols_in_bundles" = x || test "x$with_external_symbols_in_bundles" = xnone ; then
|
||||||
AC_MSG_RESULT([no])
|
AC_MSG_RESULT([no])
|
||||||
elif test "x$with_external_symbols_in_bundles" = xfull || test "x$with_external_symbols_in_bundles" = xpublic ; then
|
elif test "x$with_external_symbols_in_bundles" = xfull || test "x$with_external_symbols_in_bundles" = xpublic ; then
|
||||||
if test "x$OPENJDK_TARGET_OS" != xwindows ; then
|
if test "x$COPY_DEBUG_SYMBOLS" != xtrue ; then
|
||||||
AC_MSG_ERROR([--with-external-symbols-in-bundles currently only works on windows!])
|
AC_MSG_ERROR([--with-external-symbols-in-bundles only works when --with-native-debug-symbols=external/zipped is used!])
|
||||||
elif test "x$COPY_DEBUG_SYMBOLS" != xtrue ; then
|
elif test "x$with_external_symbols_in_bundles" = xpublic && test "x$OPENJDK_TARGET_OS" != xwindows ; then
|
||||||
AC_MSG_ERROR([--with-external-symbols-in-bundles only works when --with-native-debug-symbols=external is used!])
|
AC_MSG_ERROR([--with-external-symbols-in-bundles=public is only supported on Windows!])
|
||||||
elif test "x$with_external_symbols_in_bundles" = xfull ; then
|
fi
|
||||||
|
|
||||||
|
if test "x$with_external_symbols_in_bundles" = xfull ; then
|
||||||
AC_MSG_RESULT([full])
|
AC_MSG_RESULT([full])
|
||||||
SHIP_DEBUG_SYMBOLS=full
|
SHIP_DEBUG_SYMBOLS=full
|
||||||
else
|
else
|
||||||
AC_MSG_RESULT([public])
|
AC_MSG_RESULT([public])
|
||||||
SHIP_DEBUG_SYMBOLS=public
|
SHIP_DEBUG_SYMBOLS=public
|
||||||
fi
|
fi
|
||||||
|
elif test "x$with_external_symbols_in_bundles" = xdefault ; then
|
||||||
|
if test "x$DEBUG_LEVEL" = xrelease ; then
|
||||||
|
AC_MSG_RESULT([no (default)])
|
||||||
|
elif test "x$COPY_DEBUG_SYMBOLS" = xtrue ; then
|
||||||
|
AC_MSG_RESULT([full (default)])
|
||||||
|
SHIP_DEBUG_SYMBOLS=full
|
||||||
|
else
|
||||||
|
AC_MSG_RESULT([no (default, native debug symbols are not external/zipped)])
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
AC_MSG_ERROR([$with_external_symbols_in_bundles is an unknown value for --with-external-symbols-in-bundles])
|
AC_MSG_ERROR([$with_external_symbols_in_bundles is an unknown value for --with-external-symbols-in-bundles])
|
||||||
fi
|
fi
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2011, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2011, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -516,6 +516,7 @@ AC_DEFUN([TOOLCHAIN_EXTRACT_LD_VERSION],
|
|||||||
if [ [[ "$LINKER_VERSION_STRING" == *gold* ]] ]; then
|
if [ [[ "$LINKER_VERSION_STRING" == *gold* ]] ]; then
|
||||||
[ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
|
[ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
|
||||||
$SED -e 's/.* \([0-9][0-9]*\(\.[0-9][0-9]*\)*\).*) .*/\1/'` ]
|
$SED -e 's/.* \([0-9][0-9]*\(\.[0-9][0-9]*\)*\).*) .*/\1/'` ]
|
||||||
|
$1_TYPE=gold
|
||||||
else
|
else
|
||||||
[ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
|
[ LINKER_VERSION_NUMBER=`$ECHO $LINKER_VERSION_STRING | \
|
||||||
$SED -e 's/.* \([0-9][0-9]*\(\.[0-9][0-9]*\)*\).*/\1/'` ]
|
$SED -e 's/.* \([0-9][0-9]*\(\.[0-9][0-9]*\)*\).*/\1/'` ]
|
||||||
|
|||||||
@ -114,7 +114,7 @@ EscapeDollar = $(subst $$,\$$,$(subst \$$,$$,$(strip $1)))
|
|||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# This macro works just like EscapeDollar above, but for #.
|
# This macro works just like EscapeDollar above, but for #.
|
||||||
EscapeHash = $(subst \#,\\\#,$(subst \\\#,\#,$(strip $1)))
|
EscapeHash = $(subst $(HASH),\$(HASH),$(subst \$(HASH),$(HASH),$(strip $1)))
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
# This macro translates $ into $$ to protect the string from make itself.
|
# This macro translates $ into $$ to protect the string from make itself.
|
||||||
|
|||||||
@ -229,6 +229,14 @@ define SetupLinkerFlags
|
|||||||
# TOOLCHAIN_TYPE plus OPENJDK_TARGET_OS
|
# TOOLCHAIN_TYPE plus OPENJDK_TARGET_OS
|
||||||
ifeq ($$($1_LINK_TIME_OPTIMIZATION), true)
|
ifeq ($$($1_LINK_TIME_OPTIMIZATION), true)
|
||||||
$1_EXTRA_LDFLAGS += $(LDFLAGS_LTO)
|
$1_EXTRA_LDFLAGS += $(LDFLAGS_LTO)
|
||||||
|
# Instruct the ld64 linker not to delete the temporary object file
|
||||||
|
# generated during Link Time Optimization
|
||||||
|
ifeq ($(call isTargetOs, macosx), true)
|
||||||
|
$1_EXTRA_LDFLAGS += -Wl,-object_path_lto,$$($1_OBJECT_DIR)/$$($1_NAME)_lto_helper.o
|
||||||
|
endif
|
||||||
|
ifeq ($(TOOLCHAIN_TYPE), microsoft)
|
||||||
|
$1_EXTRA_LDFLAGS += -LTCGOUT:$$($1_OBJECT_DIR)/$$($1_NAME).iobj
|
||||||
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$1_EXTRA_LDFLAGS += $$($1_LDFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS)) \
|
$1_EXTRA_LDFLAGS += $$($1_LDFLAGS_$(OPENJDK_TARGET_OS_TYPE)) $$($1_LDFLAGS_$(OPENJDK_TARGET_OS)) \
|
||||||
|
|||||||
@ -1192,8 +1192,8 @@ var getJibProfilesDependencies = function (input, common) {
|
|||||||
server: "jpg",
|
server: "jpg",
|
||||||
product: "jcov",
|
product: "jcov",
|
||||||
version: "3.0",
|
version: "3.0",
|
||||||
build_number: "3",
|
build_number: "5",
|
||||||
file: "bundles/jcov-3.0+3.zip",
|
file: "bundles/jcov-3.0+5.zip",
|
||||||
environment_name: "JCOV_HOME",
|
environment_name: "JCOV_HOME",
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@ -26,17 +26,17 @@
|
|||||||
# Default version, product, and vendor information to use,
|
# Default version, product, and vendor information to use,
|
||||||
# unless overridden by configure
|
# unless overridden by configure
|
||||||
|
|
||||||
DEFAULT_VERSION_FEATURE=26
|
DEFAULT_VERSION_FEATURE=27
|
||||||
DEFAULT_VERSION_INTERIM=0
|
DEFAULT_VERSION_INTERIM=0
|
||||||
DEFAULT_VERSION_UPDATE=0
|
DEFAULT_VERSION_UPDATE=0
|
||||||
DEFAULT_VERSION_PATCH=0
|
DEFAULT_VERSION_PATCH=0
|
||||||
DEFAULT_VERSION_EXTRA1=0
|
DEFAULT_VERSION_EXTRA1=0
|
||||||
DEFAULT_VERSION_EXTRA2=0
|
DEFAULT_VERSION_EXTRA2=0
|
||||||
DEFAULT_VERSION_EXTRA3=0
|
DEFAULT_VERSION_EXTRA3=0
|
||||||
DEFAULT_VERSION_DATE=2026-03-17
|
DEFAULT_VERSION_DATE=2026-09-15
|
||||||
DEFAULT_VERSION_CLASSFILE_MAJOR=70 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
DEFAULT_VERSION_CLASSFILE_MAJOR=71 # "`$EXPR $DEFAULT_VERSION_FEATURE + 44`"
|
||||||
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
DEFAULT_VERSION_CLASSFILE_MINOR=0
|
||||||
DEFAULT_VERSION_DOCS_API_SINCE=11
|
DEFAULT_VERSION_DOCS_API_SINCE=11
|
||||||
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="25 26"
|
DEFAULT_ACCEPTABLE_BOOT_VERSIONS="25 26 27"
|
||||||
DEFAULT_JDK_SOURCE_TARGET_VERSION=26
|
DEFAULT_JDK_SOURCE_TARGET_VERSION=27
|
||||||
DEFAULT_PROMOTED_VERSION_PRE=ea
|
DEFAULT_PROMOTED_VERSION_PRE=ea
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 2015, 2023, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2015, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -170,6 +170,7 @@ ifeq ($(call check-jvm-feature, compiler2), true)
|
|||||||
ifeq ($(HOTSPOT_TARGET_CPU_ARCH), aarch64)
|
ifeq ($(HOTSPOT_TARGET_CPU_ARCH), aarch64)
|
||||||
AD_SRC_FILES += $(call uniq, $(wildcard $(foreach d, $(AD_SRC_ROOTS), \
|
AD_SRC_FILES += $(call uniq, $(wildcard $(foreach d, $(AD_SRC_ROOTS), \
|
||||||
$d/cpu/$(HOTSPOT_TARGET_CPU_ARCH)/$(HOTSPOT_TARGET_CPU_ARCH)_vector.ad \
|
$d/cpu/$(HOTSPOT_TARGET_CPU_ARCH)/$(HOTSPOT_TARGET_CPU_ARCH)_vector.ad \
|
||||||
|
$d/cpu/$(HOTSPOT_TARGET_CPU_ARCH)/$(HOTSPOT_TARGET_CPU_ARCH)_atomic.ad \
|
||||||
)))
|
)))
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2016, 2025, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2016, 2026, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
@ -61,7 +61,8 @@ $(eval $(call SetupJdkLibrary, BUILD_GTEST_LIBGTEST, \
|
|||||||
INCLUDE_FILES := gtest-all.cc gmock-all.cc, \
|
INCLUDE_FILES := gtest-all.cc gmock-all.cc, \
|
||||||
DISABLED_WARNINGS_gcc := format-nonliteral maybe-uninitialized undef \
|
DISABLED_WARNINGS_gcc := format-nonliteral maybe-uninitialized undef \
|
||||||
unused-result zero-as-null-pointer-constant, \
|
unused-result zero-as-null-pointer-constant, \
|
||||||
DISABLED_WARNINGS_clang := format-nonliteral undef unused-result, \
|
DISABLED_WARNINGS_clang := format-nonliteral undef unused-result \
|
||||||
|
zero-as-null-pointer-constant, \
|
||||||
DISABLED_WARNINGS_microsoft := 4530, \
|
DISABLED_WARNINGS_microsoft := 4530, \
|
||||||
DEFAULT_CFLAGS := false, \
|
DEFAULT_CFLAGS := false, \
|
||||||
CFLAGS := $(JVM_CFLAGS) \
|
CFLAGS := $(JVM_CFLAGS) \
|
||||||
|
|||||||
@ -151,6 +151,12 @@ JVM_STRIPFLAGS ?= $(STRIPFLAGS)
|
|||||||
# This source set is reused so save in cache.
|
# This source set is reused so save in cache.
|
||||||
$(call FillFindCache, $(JVM_SRC_DIRS))
|
$(call FillFindCache, $(JVM_SRC_DIRS))
|
||||||
|
|
||||||
|
ifeq ($(SHIP_DEBUG_SYMBOLS), full)
|
||||||
|
CFLAGS_SHIP_DEBUGINFO := -DSHIP_DEBUGINFO_FULL
|
||||||
|
else ifeq ($(SHIP_DEBUG_SYMBOLS), public)
|
||||||
|
CFLAGS_SHIP_DEBUGINFO := -DSHIP_DEBUGINFO_PUBLIC
|
||||||
|
endif
|
||||||
|
|
||||||
ifeq ($(call isTargetOs, windows), true)
|
ifeq ($(call isTargetOs, windows), true)
|
||||||
ifeq ($(STATIC_LIBS), true)
|
ifeq ($(STATIC_LIBS), true)
|
||||||
WIN_EXPORT_FILE := $(JVM_OUTPUTDIR)/static-win-exports.def
|
WIN_EXPORT_FILE := $(JVM_OUTPUTDIR)/static-win-exports.def
|
||||||
@ -158,10 +164,6 @@ ifeq ($(call isTargetOs, windows), true)
|
|||||||
WIN_EXPORT_FILE := $(JVM_OUTPUTDIR)/win-exports.def
|
WIN_EXPORT_FILE := $(JVM_OUTPUTDIR)/win-exports.def
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifeq ($(SHIP_DEBUG_SYMBOLS), public)
|
|
||||||
CFLAGS_STRIPPED_DEBUGINFO := -DHAS_STRIPPED_DEBUGINFO
|
|
||||||
endif
|
|
||||||
|
|
||||||
JVM_LDFLAGS += -def:$(WIN_EXPORT_FILE)
|
JVM_LDFLAGS += -def:$(WIN_EXPORT_FILE)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -187,7 +189,7 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJVM, \
|
|||||||
CFLAGS := $(JVM_CFLAGS), \
|
CFLAGS := $(JVM_CFLAGS), \
|
||||||
abstract_vm_version.cpp_CXXFLAGS := $(CFLAGS_VM_VERSION), \
|
abstract_vm_version.cpp_CXXFLAGS := $(CFLAGS_VM_VERSION), \
|
||||||
arguments.cpp_CXXFLAGS := $(CFLAGS_VM_VERSION), \
|
arguments.cpp_CXXFLAGS := $(CFLAGS_VM_VERSION), \
|
||||||
whitebox.cpp_CXXFLAGS := $(CFLAGS_STRIPPED_DEBUGINFO), \
|
whitebox.cpp_CXXFLAGS := $(CFLAGS_SHIP_DEBUGINFO), \
|
||||||
DISABLED_WARNINGS_gcc := $(DISABLED_WARNINGS_gcc), \
|
DISABLED_WARNINGS_gcc := $(DISABLED_WARNINGS_gcc), \
|
||||||
DISABLED_WARNINGS_gcc_ad_$(HOTSPOT_TARGET_CPU_ARCH).cpp := nonnull, \
|
DISABLED_WARNINGS_gcc_ad_$(HOTSPOT_TARGET_CPU_ARCH).cpp := nonnull, \
|
||||||
DISABLED_WARNINGS_gcc_bytecodeInterpreter.cpp := unused-label, \
|
DISABLED_WARNINGS_gcc_bytecodeInterpreter.cpp := unused-label, \
|
||||||
|
|||||||
@ -1,73 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
|
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
*
|
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
|
||||||
* under the terms of the GNU General Public License version 2 only, as
|
|
||||||
* published by the Free Software Foundation. Oracle designates this
|
|
||||||
* particular file as subject to the "Classpath" exception as provided
|
|
||||||
* by Oracle in the LICENSE file that accompanied this code.
|
|
||||||
*
|
|
||||||
* This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
* version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
* accompanied this code).
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License version
|
|
||||||
* 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
*
|
|
||||||
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
* or visit www.oracle.com if you need additional information or have any
|
|
||||||
* questions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package build.tools.generatecharacter;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Files;
|
|
||||||
import java.nio.file.Paths;
|
|
||||||
import java.nio.file.StandardOpenOption;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
import java.util.stream.Stream;
|
|
||||||
|
|
||||||
public class CaseFolding {
|
|
||||||
|
|
||||||
public static void main(String[] args) throws Throwable {
|
|
||||||
if (args.length != 3) {
|
|
||||||
System.err.println("Usage: java CaseFolding TemplateFile CaseFolding.txt CaseFolding.java");
|
|
||||||
System.exit(1);
|
|
||||||
}
|
|
||||||
var templateFile = Paths.get(args[0]);
|
|
||||||
var caseFoldingTxt = Paths.get(args[1]);
|
|
||||||
var genSrcFile = Paths.get(args[2]);
|
|
||||||
var supportedTypes = "^.*; [CTS]; .*$";
|
|
||||||
var caseFoldingEntries = Files.lines(caseFoldingTxt)
|
|
||||||
.filter(line -> !line.startsWith("#") && line.matches(supportedTypes))
|
|
||||||
.map(line -> {
|
|
||||||
String[] cols = line.split("; ");
|
|
||||||
return new String[] {cols[0], cols[1], cols[2]};
|
|
||||||
})
|
|
||||||
.filter(cols -> {
|
|
||||||
// the folding case doesn't map back to the original char.
|
|
||||||
var cp1 = Integer.parseInt(cols[0], 16);
|
|
||||||
var cp2 = Integer.parseInt(cols[2], 16);
|
|
||||||
return Character.toUpperCase(cp2) != cp1 && Character.toLowerCase(cp2) != cp1;
|
|
||||||
})
|
|
||||||
.map(cols -> String.format(" entry(0x%s, 0x%s)", cols[0], cols[2]))
|
|
||||||
.collect(Collectors.joining(",\n", "", ""));
|
|
||||||
|
|
||||||
// hack, hack, hack! the logic does not pick 0131. just add manually to support 'I's.
|
|
||||||
// 0049; T; 0131; # LATIN CAPITAL LETTER I
|
|
||||||
final String T_0x0131_0x49 = String.format(" entry(0x%04x, 0x%04x),\n", 0x0131, 0x49);
|
|
||||||
|
|
||||||
// Generate .java file
|
|
||||||
Files.write(
|
|
||||||
genSrcFile,
|
|
||||||
Files.lines(templateFile)
|
|
||||||
.map(line -> line.contains("%%%Entries") ? T_0x0131_0x49 + caseFoldingEntries : line)
|
|
||||||
.collect(Collectors.toList()),
|
|
||||||
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -0,0 +1,134 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
|
*
|
||||||
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms of the GNU General Public License version 2 only, as
|
||||||
|
* published by the Free Software Foundation. Oracle designates this
|
||||||
|
* particular file as subject to the "Classpath" exception as provided
|
||||||
|
* by Oracle in the LICENSE file that accompanied this code.
|
||||||
|
*
|
||||||
|
* This code is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
* version 2 for more details (a copy is included in the LICENSE file that
|
||||||
|
* accompanied this code).
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License version
|
||||||
|
* 2 along with this work; if not, write to the Free Software Foundation,
|
||||||
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
||||||
|
* or visit www.oracle.com if you need additional information or have any
|
||||||
|
* questions.
|
||||||
|
*/
|
||||||
|
package build.tools.generatecharacter;
|
||||||
|
|
||||||
|
import java.nio.file.Files;
|
||||||
|
import java.nio.file.Paths;
|
||||||
|
import java.nio.file.StandardOpenOption;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
public class GenerateCaseFolding {
|
||||||
|
|
||||||
|
public static void main(String[] args) throws Throwable {
|
||||||
|
if (args.length != 3) {
|
||||||
|
System.err.println("Usage: java GenerateCaseFolding TemplateFile CaseFolding.txt CaseFolding.java");
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
var templateFile = Paths.get(args[0]);
|
||||||
|
var caseFoldingTxt = Paths.get(args[1]);
|
||||||
|
var genSrcFile = Paths.get(args[2]);
|
||||||
|
|
||||||
|
// java.lang
|
||||||
|
var supportedTypes = "^.*; [CF]; .*$"; // full/1:M case folding
|
||||||
|
String[][] caseFoldings = Files.lines(caseFoldingTxt)
|
||||||
|
.filter(line -> !line.startsWith("#") && line.matches(supportedTypes))
|
||||||
|
.map(line -> {
|
||||||
|
var fields = line.split("; ");
|
||||||
|
var cp = fields[0];
|
||||||
|
fields = fields[2].trim().split(" ");
|
||||||
|
var folding = new String[fields.length + 1];
|
||||||
|
folding[0] = cp;
|
||||||
|
System.arraycopy(fields, 0, folding, 1, fields.length);
|
||||||
|
return folding;
|
||||||
|
})
|
||||||
|
.toArray(size -> new String[size][]);
|
||||||
|
|
||||||
|
// util.regex
|
||||||
|
var expandedSupportedTypes = "^.*; [CTS]; .*$";
|
||||||
|
var expanded_caseFoldingEntries = Files.lines(caseFoldingTxt)
|
||||||
|
.filter(line -> !line.startsWith("#") && line.matches(expandedSupportedTypes))
|
||||||
|
.map(line -> {
|
||||||
|
String[] cols = line.split("; ");
|
||||||
|
return new String[]{cols[0], cols[1], cols[2]};
|
||||||
|
})
|
||||||
|
.filter(cols -> {
|
||||||
|
// the folding case doesn't map back to the original char.
|
||||||
|
var cp1 = Integer.parseInt(cols[0], 16);
|
||||||
|
var cp2 = Integer.parseInt(cols[2], 16);
|
||||||
|
return Character.toUpperCase(cp2) != cp1 && Character.toLowerCase(cp2) != cp1;
|
||||||
|
})
|
||||||
|
.map(cols -> String.format(" entry(0x%s, 0x%s)", cols[0], cols[2]))
|
||||||
|
.collect(Collectors.joining(",\n", "", ""));
|
||||||
|
|
||||||
|
// hack, hack, hack! the logic does not pick 0131. just add manually to support 'I's.
|
||||||
|
// 0049; T; 0131; # LATIN CAPITAL LETTER I
|
||||||
|
final String T_0x0131_0x49 = String.format(" entry(0x%04x, 0x%04x),\n", 0x0131, 0x49);
|
||||||
|
|
||||||
|
Files.write(
|
||||||
|
genSrcFile,
|
||||||
|
Files.lines(templateFile)
|
||||||
|
.map(line -> line.contains("%%%Entries") ? genFoldingEntries(caseFoldings) : line)
|
||||||
|
.map(line -> line.contains("%%%Expanded_Case_Map_Entries") ? T_0x0131_0x49 + expanded_caseFoldingEntries : line)
|
||||||
|
.collect(Collectors.toList()),
|
||||||
|
StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static long foldingToLong(String[] folding) {
|
||||||
|
int cp = Integer.parseInt(folding[0], 16);
|
||||||
|
long value = (long)Integer.parseInt(folding[1], 16);
|
||||||
|
if (!Character.isSupplementaryCodePoint(cp) && folding.length != 2) {
|
||||||
|
var shift = 16;
|
||||||
|
for (int j = 2; j < folding.length; j++) {
|
||||||
|
value |= (long)Integer.parseInt(folding[j], 16) << shift;
|
||||||
|
shift <<= 1;
|
||||||
|
}
|
||||||
|
value = value | (long) (folding.length - 1) << 48;
|
||||||
|
}
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String genFoldingEntries(String[][] foldings) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
sb.append(" private static final int[] CASE_FOLDING_CPS = {\n");
|
||||||
|
int width = 10;
|
||||||
|
for (int i = 0; i < foldings.length; i++) {
|
||||||
|
if (i % width == 0)
|
||||||
|
sb.append(" ");
|
||||||
|
sb.append(String.format("0X%s", foldings[i][0]));
|
||||||
|
if (i < foldings.length - 1)
|
||||||
|
sb.append(", ");
|
||||||
|
if (i % width == width - 1 || i == foldings.length - 1)
|
||||||
|
sb.append("\n");
|
||||||
|
}
|
||||||
|
sb.append(" };\n\n");
|
||||||
|
|
||||||
|
sb.append(" private static final long[] CASE_FOLDING_VALUES = {\n");
|
||||||
|
width = 6;
|
||||||
|
for (int i = 0; i < foldings.length; i++) {
|
||||||
|
if (i % width == 0)
|
||||||
|
sb.append(" "); // indent
|
||||||
|
sb.append(String.format("0x%013xL", foldingToLong(foldings[i])));
|
||||||
|
if (i < foldings.length - 1)
|
||||||
|
sb.append(", ");
|
||||||
|
if (i % width == width - 1 || i == foldings.length - 1) {
|
||||||
|
sb.append("\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.append(" };\n");
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -31,10 +31,9 @@ import java.util.Set;
|
|||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
import javax.lang.model.element.Element;
|
import javax.lang.model.element.Element;
|
||||||
import javax.lang.model.element.PackageElement;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
|
|
||||||
import com.sun.source.doctree.DocTree;
|
import com.sun.source.doctree.DocTree;
|
||||||
import com.sun.source.doctree.LiteralTree;
|
import com.sun.source.doctree.LiteralTree;
|
||||||
@ -160,9 +159,10 @@ public class JSpec implements Taglet {
|
|||||||
if (m.find()) {
|
if (m.find()) {
|
||||||
String chapter = m.group("chapter");
|
String chapter = m.group("chapter");
|
||||||
String section = m.group("section");
|
String section = m.group("section");
|
||||||
|
String rootParent = currentPath().replaceAll("[^/]+", "..");
|
||||||
|
|
||||||
String url = String.format("%1$s/../specs/%2$s/%2$s-%3$s.html#%2$s-%3$s%4$s",
|
String url = String.format("%1$s/specs/%2$s/%2$s-%3$s.html#%2$s-%3$s%4$s",
|
||||||
docRoot(elem), idPrefix, chapter, section);
|
rootParent, idPrefix, chapter, section);
|
||||||
|
|
||||||
sb.append("<a href=\"")
|
sb.append("<a href=\"")
|
||||||
.append(url)
|
.append(url)
|
||||||
@ -183,6 +183,22 @@ public class JSpec implements Taglet {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static ThreadLocal<String> CURRENT_PATH = null;
|
||||||
|
|
||||||
|
private String currentPath() {
|
||||||
|
if (CURRENT_PATH == null) {
|
||||||
|
try {
|
||||||
|
Field f = Class.forName("jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter")
|
||||||
|
.getField("CURRENT_PATH");
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
ThreadLocal<String> tl = (ThreadLocal<String>) f.get(null);
|
||||||
|
CURRENT_PATH = tl;
|
||||||
|
} catch (ReflectiveOperationException e) {
|
||||||
|
throw new RuntimeException("Cannot determine current path", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return CURRENT_PATH.get();
|
||||||
|
}
|
||||||
|
|
||||||
private String expand(List<? extends DocTree> trees) {
|
private String expand(List<? extends DocTree> trees) {
|
||||||
return (new SimpleDocTreeVisitor<StringBuilder, StringBuilder>() {
|
return (new SimpleDocTreeVisitor<StringBuilder, StringBuilder>() {
|
||||||
@ -209,34 +225,4 @@ public class JSpec implements Taglet {
|
|||||||
}).visit(trees, new StringBuilder()).toString();
|
}).visit(trees, new StringBuilder()).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private String docRoot(Element elem) {
|
|
||||||
switch (elem.getKind()) {
|
|
||||||
case MODULE:
|
|
||||||
return "..";
|
|
||||||
|
|
||||||
case PACKAGE:
|
|
||||||
PackageElement pe = (PackageElement)elem;
|
|
||||||
String pkgPart = pe.getQualifiedName()
|
|
||||||
.toString()
|
|
||||||
.replace('.', '/')
|
|
||||||
.replaceAll("[^/]+", "..");
|
|
||||||
return pe.getEnclosingElement() != null
|
|
||||||
? "../" + pkgPart
|
|
||||||
: pkgPart;
|
|
||||||
|
|
||||||
case CLASS, ENUM, RECORD, INTERFACE, ANNOTATION_TYPE:
|
|
||||||
TypeElement te = (TypeElement)elem;
|
|
||||||
return te.getQualifiedName()
|
|
||||||
.toString()
|
|
||||||
.replace('.', '/')
|
|
||||||
.replaceAll("[^/]+", "..");
|
|
||||||
|
|
||||||
default:
|
|
||||||
var enclosing = elem.getEnclosingElement();
|
|
||||||
if (enclosing == null)
|
|
||||||
throw new IllegalArgumentException(elem.getKind().toString());
|
|
||||||
return docRoot(enclosing);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2017, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
@ -31,10 +31,9 @@ import java.util.Set;
|
|||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
import javax.lang.model.element.Element;
|
import javax.lang.model.element.Element;
|
||||||
import javax.lang.model.element.PackageElement;
|
|
||||||
import javax.lang.model.element.TypeElement;
|
|
||||||
|
|
||||||
import com.sun.source.doctree.DocTree;
|
import com.sun.source.doctree.DocTree;
|
||||||
import com.sun.source.doctree.UnknownBlockTagTree;
|
import com.sun.source.doctree.UnknownBlockTagTree;
|
||||||
@ -68,7 +67,7 @@ public class ToolGuide implements Taglet {
|
|||||||
|
|
||||||
static final String TAG_NAME = "toolGuide";
|
static final String TAG_NAME = "toolGuide";
|
||||||
|
|
||||||
static final String BASE_URL = "../specs/man";
|
static final String BASE_URL = "specs/man";
|
||||||
|
|
||||||
static final Pattern TAG_PATTERN = Pattern.compile("(?s)(?<name>[A-Za-z0-9]+)\\s*(?<label>.*)$");
|
static final Pattern TAG_PATTERN = Pattern.compile("(?s)(?<name>[A-Za-z0-9]+)\\s*(?<label>.*)$");
|
||||||
|
|
||||||
@ -119,9 +118,10 @@ public class ToolGuide implements Taglet {
|
|||||||
if (label.isEmpty()) {
|
if (label.isEmpty()) {
|
||||||
label = name;
|
label = name;
|
||||||
}
|
}
|
||||||
|
String rootParent = currentPath().replaceAll("[^/]+", "..");
|
||||||
|
|
||||||
String url = String.format("%s/%s/%s.html",
|
String url = String.format("%s/%s/%s.html",
|
||||||
docRoot(elem), BASE_URL, name);
|
rootParent, BASE_URL, name);
|
||||||
|
|
||||||
if (needComma) {
|
if (needComma) {
|
||||||
sb.append(",\n");
|
sb.append(",\n");
|
||||||
@ -142,33 +142,21 @@ public class ToolGuide implements Taglet {
|
|||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private String docRoot(Element elem) {
|
private static ThreadLocal<String> CURRENT_PATH = null;
|
||||||
switch (elem.getKind()) {
|
|
||||||
case MODULE:
|
|
||||||
return "..";
|
|
||||||
|
|
||||||
case PACKAGE:
|
private String currentPath() {
|
||||||
PackageElement pe = (PackageElement)elem;
|
if (CURRENT_PATH == null) {
|
||||||
String pkgPart = pe.getQualifiedName()
|
try {
|
||||||
.toString()
|
Field f = Class.forName("jdk.javadoc.internal.doclets.formats.html.HtmlDocletWriter")
|
||||||
.replace('.', '/')
|
.getField("CURRENT_PATH");
|
||||||
.replaceAll("[^/]+", "..");
|
@SuppressWarnings("unchecked")
|
||||||
return pe.getEnclosingElement() != null
|
ThreadLocal<String> tl = (ThreadLocal<String>) f.get(null);
|
||||||
? "../" + pkgPart
|
CURRENT_PATH = tl;
|
||||||
: pkgPart;
|
} catch (ReflectiveOperationException e) {
|
||||||
|
throw new RuntimeException("Cannot determine current path", e);
|
||||||
case CLASS, ENUM, RECORD, INTERFACE, ANNOTATION_TYPE:
|
}
|
||||||
TypeElement te = (TypeElement)elem;
|
|
||||||
return te.getQualifiedName()
|
|
||||||
.toString()
|
|
||||||
.replace('.', '/')
|
|
||||||
.replaceAll("[^/]+", "..");
|
|
||||||
|
|
||||||
default:
|
|
||||||
var enclosing = elem.getEnclosingElement();
|
|
||||||
if (enclosing == null)
|
|
||||||
throw new IllegalArgumentException(elem.getKind().toString());
|
|
||||||
return docRoot(enclosing);
|
|
||||||
}
|
}
|
||||||
|
return CURRENT_PATH.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -286,7 +286,7 @@ public class ClassGenerator {
|
|||||||
diagnosticFlags.isEmpty() ?
|
diagnosticFlags.isEmpty() ?
|
||||||
StubKind.DIAGNOSTIC_FLAGS_EMPTY.format() :
|
StubKind.DIAGNOSTIC_FLAGS_EMPTY.format() :
|
||||||
StubKind.DIAGNOSTIC_FLAGS_NON_EMPTY.format(diagnosticFlags),
|
StubKind.DIAGNOSTIC_FLAGS_NON_EMPTY.format(diagnosticFlags),
|
||||||
StubKind.LINT_CATEGORY.format("\"" + lintCategory + "\""),
|
StubKind.LINT_CATEGORY.format(toLintFieldName(lintCategory)),
|
||||||
"\"" + keyParts[0] + "\"",
|
"\"" + keyParts[0] + "\"",
|
||||||
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
||||||
javadoc);
|
javadoc);
|
||||||
@ -314,7 +314,7 @@ public class ClassGenerator {
|
|||||||
diagnosticFlags.isEmpty() ?
|
diagnosticFlags.isEmpty() ?
|
||||||
StubKind.DIAGNOSTIC_FLAGS_EMPTY.format() :
|
StubKind.DIAGNOSTIC_FLAGS_EMPTY.format() :
|
||||||
StubKind.DIAGNOSTIC_FLAGS_NON_EMPTY.format(diagnosticFlags),
|
StubKind.DIAGNOSTIC_FLAGS_NON_EMPTY.format(diagnosticFlags),
|
||||||
StubKind.LINT_CATEGORY.format("\"" + lintCategory + "\""),
|
StubKind.LINT_CATEGORY.format(toLintFieldName(lintCategory)),
|
||||||
"\"" + keyParts[0] + "\"",
|
"\"" + keyParts[0] + "\"",
|
||||||
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
"\"" + Stream.of(keyParts).skip(2).collect(Collectors.joining(".")) + "\"",
|
||||||
argNames.stream().collect(Collectors.joining(", ")));
|
argNames.stream().collect(Collectors.joining(", ")));
|
||||||
@ -329,6 +329,11 @@ public class ClassGenerator {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String toLintFieldName(String lintCategory) {
|
||||||
|
return lintCategory.toUpperCase()
|
||||||
|
.replaceAll("-", "_");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Form the name of a factory method/field given a resource key.
|
* Form the name of a factory method/field given a resource key.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2014, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -87,7 +87,7 @@ suppress.warnings=\
|
|||||||
@SuppressWarnings("rawtypes")\n
|
@SuppressWarnings("rawtypes")\n
|
||||||
|
|
||||||
lint.category=\
|
lint.category=\
|
||||||
LintCategory.get({0}).get()
|
LintCategory.{0}
|
||||||
|
|
||||||
diagnostic.flags.empty=\
|
diagnostic.flags.empty=\
|
||||||
EnumSet.noneOf(DiagnosticFlag.class)
|
EnumSet.noneOf(DiagnosticFlag.class)
|
||||||
|
|||||||
@ -120,3 +120,25 @@ $(INTPOLY_GEN_DONE): $(INTPLOY_HEADER) $(BUILD_TOOLS_JDK)
|
|||||||
TARGETS += $(INTPOLY_GEN_DONE)
|
TARGETS += $(INTPOLY_GEN_DONE)
|
||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
RELEASE_FILE_TEMPLATE := $(TOPDIR)/src/java.base/share/classes/jdk/internal/misc/resources/release.txt.template
|
||||||
|
RELEASE_FILE_TARGET := $(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/jdk/internal/misc/resources/release.txt
|
||||||
|
|
||||||
|
RELEASE_FILE_VARDEPS := $(COMPANY_NAME) $(VERSION_STRING) $(VERSION_DATE)
|
||||||
|
RELEASE_FILE_VARDEPS_FILE := $(call DependOnVariable, RELEASE_FILE_VARDEPS, \
|
||||||
|
$(SUPPORT_OUTPUTDIR)/gensrc/$(MODULE)/jlink_release_txt.vardeps)
|
||||||
|
|
||||||
|
$(eval $(call SetupTextFileProcessing, BUILD_RELEASE_FILE, \
|
||||||
|
SOURCE_FILES := $(RELEASE_FILE_TEMPLATE), \
|
||||||
|
OUTPUT_FILE := $(RELEASE_FILE_TARGET), \
|
||||||
|
REPLACEMENTS := \
|
||||||
|
@@COMPANY_NAME@@ => $(COMPANY_NAME) ; \
|
||||||
|
@@VERSION_STRING@@ => $(VERSION_STRING) ; \
|
||||||
|
@@VERSION_DATE@@ => $(VERSION_DATE) , \
|
||||||
|
))
|
||||||
|
|
||||||
|
$(BUILD_RELEASE_FILE): $(RELEASE_FILE_VARDEPS_FILE)
|
||||||
|
|
||||||
|
TARGETS += $(BUILD_RELEASE_FILE)
|
||||||
|
|
||||||
|
################################################################################
|
||||||
|
|||||||
@ -34,7 +34,7 @@
|
|||||||
DOCLINT += -Xdoclint:all/protected \
|
DOCLINT += -Xdoclint:all/protected \
|
||||||
'-Xdoclint/package:java.*,javax.*'
|
'-Xdoclint/package:java.*,javax.*'
|
||||||
JAVAC_FLAGS += -XDstringConcat=inline
|
JAVAC_FLAGS += -XDstringConcat=inline
|
||||||
COPY += .icu .dat .spp .nrm content-types.properties \
|
COPY += .icu .dat .spp .nrm .txt content-types.properties \
|
||||||
hijrah-config-Hijrah-umalqura_islamic-umalqura.properties
|
hijrah-config-Hijrah-umalqura_islamic-umalqura.properties
|
||||||
CLEAN += intrinsic.properties
|
CLEAN += intrinsic.properties
|
||||||
|
|
||||||
|
|||||||
@ -72,5 +72,22 @@ TARGETS += $(GENSRC_CHARACTERDATA)
|
|||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
|
|
||||||
|
GENSRC_STRINGCASEFOLDING := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/jdk/internal/lang/CaseFolding.java
|
||||||
|
|
||||||
|
STRINGCASEFOLDING_TEMPLATE := $(MODULE_SRC)/share/classes/jdk/internal/lang/CaseFolding.java.template
|
||||||
|
CASEFOLDINGTXT := $(MODULE_SRC)/share/data/unicodedata/CaseFolding.txt
|
||||||
|
|
||||||
|
$(GENSRC_STRINGCASEFOLDING): $(BUILD_TOOLS_JDK) $(STRINGCASEFOLDING_TEMPLATE) $(CASEFOLDINGTXT)
|
||||||
|
$(call LogInfo, Generating $@)
|
||||||
|
$(call MakeTargetDir)
|
||||||
|
$(TOOL_GENERATECASEFOLDING) \
|
||||||
|
$(STRINGCASEFOLDING_TEMPLATE) \
|
||||||
|
$(CASEFOLDINGTXT) \
|
||||||
|
$(GENSRC_STRINGCASEFOLDING)
|
||||||
|
|
||||||
|
TARGETS += $(GENSRC_STRINGCASEFOLDING)
|
||||||
|
|
||||||
|
|
||||||
endif # include guard
|
endif # include guard
|
||||||
include MakeIncludeEnd.gmk
|
include MakeIncludeEnd.gmk
|
||||||
|
|||||||
@ -50,22 +50,5 @@ TARGETS += $(GENSRC_INDICCONJUNCTBREAK)
|
|||||||
|
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
GENSRC_CASEFOLDING := $(SUPPORT_OUTPUTDIR)/gensrc/java.base/jdk/internal/util/regex/CaseFolding.java
|
|
||||||
|
|
||||||
CASEFOLDINGTEMP := $(MODULE_SRC)/share/classes/jdk/internal/util/regex/CaseFolding.java.template
|
|
||||||
CASEFOLDINGTXT := $(MODULE_SRC)/share/data/unicodedata/CaseFolding.txt
|
|
||||||
|
|
||||||
$(GENSRC_CASEFOLDING): $(BUILD_TOOLS_JDK) $(CASEFOLDINGTEMP) $(CASEFOLDINGTXT)
|
|
||||||
$(call LogInfo, Generating $@)
|
|
||||||
$(call MakeTargetDir)
|
|
||||||
$(TOOL_GENERATECASEFOLDING) \
|
|
||||||
$(CASEFOLDINGTEMP) \
|
|
||||||
$(CASEFOLDINGTXT) \
|
|
||||||
$(GENSRC_CASEFOLDING)
|
|
||||||
|
|
||||||
TARGETS += $(GENSRC_CASEFOLDING)
|
|
||||||
|
|
||||||
################################################################################
|
|
||||||
|
|
||||||
endif # include guard
|
endif # include guard
|
||||||
include MakeIncludeEnd.gmk
|
include MakeIncludeEnd.gmk
|
||||||
|
|||||||
@ -164,6 +164,24 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
|
|||||||
|
|
||||||
ifeq ($(USE_EXTERNAL_LIBPNG), false)
|
ifeq ($(USE_EXTERNAL_LIBPNG), false)
|
||||||
LIBSPLASHSCREEN_HEADER_DIRS += libsplashscreen/libpng
|
LIBSPLASHSCREEN_HEADER_DIRS += libsplashscreen/libpng
|
||||||
|
LIBSPLASHSCREEN_CFLAGS += -DPNG_NO_MMX_CODE -DPNG_ARM_NEON_OPT=0 \
|
||||||
|
-DPNG_ARM_NEON_IMPLEMENTATION=0 -DPNG_LOONGARCH_LSX_OPT=0
|
||||||
|
|
||||||
|
ifeq ($(call isTargetOs, linux)+$(call isTargetCpuArch, ppc), true+true)
|
||||||
|
LIBSPLASHSCREEN_CFLAGS += -DPNG_POWERPC_VSX_OPT=0
|
||||||
|
endif
|
||||||
|
|
||||||
|
# The libpng bundled with jdk is a reduced version which does not
|
||||||
|
# contain .png_init_filter_functions_vsx.
|
||||||
|
# Therefore we need to disable PNG_POWERPC_VSX_OPT explicitly by setting
|
||||||
|
# it to 0. If this define is not set, it would be automatically set to 2,
|
||||||
|
# because
|
||||||
|
# "#if defined(__PPC64__) && defined(__ALTIVEC__) && defined(__VSX__)"
|
||||||
|
# expands to true. This would results in the fact that
|
||||||
|
# .png_init_filter_functions_vsx is needed in libpng.
|
||||||
|
ifeq ($(call isTargetOs, aix), true)
|
||||||
|
LIBSPLASHSCREEN_CFLAGS += -DPNG_POWERPC_VSX_OPT=0
|
||||||
|
endif
|
||||||
else
|
else
|
||||||
LIBSPLASHSCREEN_EXCLUDES += libpng
|
LIBSPLASHSCREEN_EXCLUDES += libpng
|
||||||
endif
|
endif
|
||||||
@ -176,25 +194,7 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
|
|||||||
LIBSPLASHSCREEN_STATIC_LIB_EXCLUDE_OBJS += $(LIBZIP_OBJS)
|
LIBSPLASHSCREEN_STATIC_LIB_EXCLUDE_OBJS += $(LIBZIP_OBJS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
LIBSPLASHSCREEN_CFLAGS += -DSPLASHSCREEN -DPNG_NO_MMX_CODE \
|
LIBSPLASHSCREEN_CFLAGS += -DSPLASHSCREEN
|
||||||
-DPNG_ARM_NEON_OPT=0 -DPNG_ARM_NEON_IMPLEMENTATION=0 \
|
|
||||||
-DPNG_LOONGARCH_LSX_OPT=0
|
|
||||||
|
|
||||||
ifeq ($(call isTargetOs, linux)+$(call isTargetCpuArch, ppc), true+true)
|
|
||||||
LIBSPLASHSCREEN_CFLAGS += -DPNG_POWERPC_VSX_OPT=0
|
|
||||||
endif
|
|
||||||
|
|
||||||
# The external libpng submitted in the jdk is a reduced version
|
|
||||||
# which does not contain .png_init_filter_functions_vsx.
|
|
||||||
# Therefore we need to disable PNG_POWERPC_VSX_OPT explicitly by setting
|
|
||||||
# it to 0. If this define is not set, it would be automatically set to 2,
|
|
||||||
# because
|
|
||||||
# "#if defined(__PPC64__) && defined(__ALTIVEC__) && defined(__VSX__)"
|
|
||||||
# expands to true. This would results in the fact that
|
|
||||||
# .png_init_filter_functions_vsx is needed in libpng.
|
|
||||||
ifeq ($(call isTargetOs, aix), true)
|
|
||||||
LIBSPLASHSCREEN_CFLAGS += -DPNG_POWERPC_VSX_OPT=0
|
|
||||||
endif
|
|
||||||
|
|
||||||
ifeq ($(call isTargetOs, macosx), true)
|
ifeq ($(call isTargetOs, macosx), true)
|
||||||
# libsplashscreen on macosx does not use the unix code
|
# libsplashscreen on macosx does not use the unix code
|
||||||
@ -237,7 +237,7 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
|
|||||||
DISABLED_WARNINGS_gcc_dgif_lib.c := sign-compare, \
|
DISABLED_WARNINGS_gcc_dgif_lib.c := sign-compare, \
|
||||||
DISABLED_WARNINGS_gcc_jcmaster.c := implicit-fallthrough, \
|
DISABLED_WARNINGS_gcc_jcmaster.c := implicit-fallthrough, \
|
||||||
DISABLED_WARNINGS_gcc_jdphuff.c := shift-negative-value, \
|
DISABLED_WARNINGS_gcc_jdphuff.c := shift-negative-value, \
|
||||||
DISABLED_WARNINGS_gcc_png.c := maybe-uninitialized unused-function, \
|
DISABLED_WARNINGS_gcc_png.c := maybe-uninitialized, \
|
||||||
DISABLED_WARNINGS_gcc_pngerror.c := maybe-uninitialized, \
|
DISABLED_WARNINGS_gcc_pngerror.c := maybe-uninitialized, \
|
||||||
DISABLED_WARNINGS_gcc_splashscreen_gfx_impl.c := implicit-fallthrough \
|
DISABLED_WARNINGS_gcc_splashscreen_gfx_impl.c := implicit-fallthrough \
|
||||||
maybe-uninitialized, \
|
maybe-uninitialized, \
|
||||||
@ -248,7 +248,6 @@ ifeq ($(ENABLE_HEADLESS_ONLY), false)
|
|||||||
DISABLED_WARNINGS_clang := deprecated-non-prototype, \
|
DISABLED_WARNINGS_clang := deprecated-non-prototype, \
|
||||||
DISABLED_WARNINGS_clang_dgif_lib.c := sign-compare, \
|
DISABLED_WARNINGS_clang_dgif_lib.c := sign-compare, \
|
||||||
DISABLED_WARNINGS_clang_gzwrite.c := format-nonliteral, \
|
DISABLED_WARNINGS_clang_gzwrite.c := format-nonliteral, \
|
||||||
DISABLED_WARNINGS_clang_png.c := unused-function, \
|
|
||||||
DISABLED_WARNINGS_clang_splashscreen_impl.c := sign-compare \
|
DISABLED_WARNINGS_clang_splashscreen_impl.c := sign-compare \
|
||||||
unused-but-set-variable unused-function, \
|
unused-but-set-variable unused-function, \
|
||||||
DISABLED_WARNINGS_clang_splashscreen_png.c := \
|
DISABLED_WARNINGS_clang_splashscreen_png.c := \
|
||||||
|
|||||||
@ -54,21 +54,6 @@ $(eval $(call SetupJdkLibrary, BUILD_LIBJDWP, \
|
|||||||
NAME := jdwp, \
|
NAME := jdwp, \
|
||||||
OPTIMIZATION := LOW, \
|
OPTIMIZATION := LOW, \
|
||||||
CFLAGS := -DJDWP_LOGGING $(ICONV_CFLAGS), \
|
CFLAGS := -DJDWP_LOGGING $(ICONV_CFLAGS), \
|
||||||
DISABLED_WARNINGS_gcc_eventFilter.c := unused-variable, \
|
|
||||||
DISABLED_WARNINGS_gcc_SDE.c := unused-function, \
|
|
||||||
DISABLED_WARNINGS_gcc_threadControl.c := unused-but-set-variable \
|
|
||||||
unused-variable, \
|
|
||||||
DISABLED_WARNINGS_gcc_utf_util.c := unused-but-set-variable, \
|
|
||||||
DISABLED_WARNINGS_clang_error_messages.c := format-nonliteral, \
|
|
||||||
DISABLED_WARNINGS_clang_eventFilter.c := unused-variable, \
|
|
||||||
DISABLED_WARNINGS_clang_EventRequestImpl.c := self-assign, \
|
|
||||||
DISABLED_WARNINGS_clang_inStream.c := sometimes-uninitialized, \
|
|
||||||
DISABLED_WARNINGS_clang_log_messages.c := format-nonliteral, \
|
|
||||||
DISABLED_WARNINGS_clang_SDE.c := unused-function, \
|
|
||||||
DISABLED_WARNINGS_clang_threadControl.c := unused-but-set-variable \
|
|
||||||
unused-variable, \
|
|
||||||
DISABLED_WARNINGS_clang_utf_util.c := unused-but-set-variable, \
|
|
||||||
DISABLED_WARNINGS_microsoft_debugInit.c := 5287, \
|
|
||||||
LDFLAGS := $(ICONV_LDFLAGS), \
|
LDFLAGS := $(ICONV_LDFLAGS), \
|
||||||
EXTRA_HEADER_DIRS := \
|
EXTRA_HEADER_DIRS := \
|
||||||
include \
|
include \
|
||||||
|
|||||||
@ -31,13 +31,14 @@ include LibCommon.gmk
|
|||||||
## Build libjaas
|
## Build libjaas
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|
||||||
$(eval $(call SetupJdkLibrary, BUILD_LIBJAAS, \
|
ifeq ($(call isTargetOs, windows), true)
|
||||||
NAME := jaas, \
|
$(eval $(call SetupJdkLibrary, BUILD_LIBJAAS, \
|
||||||
OPTIMIZATION := LOW, \
|
NAME := jaas, \
|
||||||
EXTRA_HEADER_DIRS := java.base:libjava, \
|
OPTIMIZATION := LOW, \
|
||||||
LIBS_windows := advapi32.lib mpr.lib netapi32.lib user32.lib, \
|
EXTRA_HEADER_DIRS := java.base:libjava, \
|
||||||
))
|
LIBS_windows := advapi32.lib mpr.lib netapi32.lib user32.lib, \
|
||||||
|
))
|
||||||
TARGETS += $(BUILD_LIBJAAS)
|
|
||||||
|
|
||||||
|
TARGETS += $(BUILD_LIBJAAS)
|
||||||
|
endif
|
||||||
################################################################################
|
################################################################################
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# Copyright (c) 2012, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2012, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
#
|
#
|
||||||
# This code is free software; you can redistribute it and/or modify it
|
# This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# Copyright (c) 2002, 2024, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions
|
# modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<!--
|
<!--
|
||||||
Copyright (c) 2005, 2024, Oracle and/or its affiliates. All rights reserved.
|
Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
Redistribution and use in source and binary forms, with or without
|
||||||
modification, are permitted provided that the following conditions
|
modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2002, 2018, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2002, 2013, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007, 2021, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
*
|
*
|
||||||
* Copyright (c) 2007, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2007, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
*
|
*
|
||||||
* Redistribution and use in source and binary forms, with or without
|
* Redistribution and use in source and binary forms, with or without
|
||||||
* modification, are permitted provided that the following conditions
|
* modification, are permitted provided that the following conditions
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
# Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
|
# Copyright (c) 2010, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
#
|
#
|
||||||
# Redistribution and use in source and binary forms, with or without
|
# Redistribution and use in source and binary forms, with or without
|
||||||
# modification, are permitted provided that the following conditions
|
# modification, are permitted provided that the following conditions
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
909
src/hotspot/cpu/aarch64/aarch64_atomic.ad
Normal file
909
src/hotspot/cpu/aarch64/aarch64_atomic.ad
Normal file
@ -0,0 +1,909 @@
|
|||||||
|
// Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
// Copyright (c) 2016, 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.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
// BEGIN This file is automatically generated. Do not edit --------------
|
||||||
|
|
||||||
|
// Sundry CAS operations. Note that release is always true,
|
||||||
|
// regardless of the memory ordering of the CAS. This is because we
|
||||||
|
// need the volatile case to be sequentially consistent but there is
|
||||||
|
// no trailing StoreLoad barrier emitted by C2. Unfortunately we
|
||||||
|
// can't check the type of memory ordering here, so we always emit a
|
||||||
|
// STLXR.
|
||||||
|
|
||||||
|
// This section is generated from aarch64_atomic_ad.m4
|
||||||
|
|
||||||
|
|
||||||
|
instruct compareAndExchangeB(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (CompareAndExchangeB mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgb $res = $mem, $oldval, $newval\t# (byte) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::byte, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
__ sxtbw($res$$Register, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeS(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (CompareAndExchangeS mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgs $res = $mem, $oldval, $newval\t# (short) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::halfword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
__ sxthw($res$$Register, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeI(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (CompareAndExchangeI mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw $res = $mem, $oldval, $newval\t# (int) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeL(iRegLNoSp res, indirect mem, iRegL oldval, iRegL newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (CompareAndExchangeL mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg $res = $mem, $oldval, $newval\t# (long) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeN(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
|
||||||
|
predicate(n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set res (CompareAndExchangeN mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw $res = $mem, $oldval, $newval\t# (narrow oop) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, rFlagsReg cr) %{
|
||||||
|
predicate(n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg $res = $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeBAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (CompareAndExchangeB mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgb_acq $res = $mem, $oldval, $newval\t# (byte) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::byte, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
__ sxtbw($res$$Register, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeSAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (CompareAndExchangeS mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgs_acq $res = $mem, $oldval, $newval\t# (short) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::halfword, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
__ sxthw($res$$Register, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeIAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (CompareAndExchangeI mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw_acq $res = $mem, $oldval, $newval\t# (int) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeLAcq(iRegLNoSp res, indirect mem, iRegL oldval, iRegL newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (CompareAndExchangeL mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg_acq $res = $mem, $oldval, $newval\t# (long) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangeNAcq(iRegNNoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set res (CompareAndExchangeN mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw_acq $res = $mem, $oldval, $newval\t# (narrow oop) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n) && (n->as_LoadStore()->barrier_data() == 0));
|
||||||
|
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg_acq $res = $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapB(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (CompareAndSwapB mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgb $res = $mem, $oldval, $newval\t# (byte) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::byte, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapS(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (CompareAndSwapS mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgs $res = $mem, $oldval, $newval\t# (short) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::halfword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapI(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (CompareAndSwapI mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw $res = $mem, $oldval, $newval\t# (int) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapL(iRegINoSp res, indirect mem, iRegL oldval, iRegL newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (CompareAndSwapL mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg $res = $mem, $oldval, $newval\t# (long) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapN(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
|
||||||
|
predicate(n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set res (CompareAndSwapN mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw $res = $mem, $oldval, $newval\t# (narrow oop) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, rFlagsReg cr) %{
|
||||||
|
predicate(n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg $res = $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapBAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (CompareAndSwapB mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgb_acq $res = $mem, $oldval, $newval\t# (byte) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::byte, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapSAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (CompareAndSwapS mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgs_acq $res = $mem, $oldval, $newval\t# (short) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::halfword, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapIAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (CompareAndSwapI mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw_acq $res = $mem, $oldval, $newval\t# (int) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapLAcq(iRegINoSp res, indirect mem, iRegL oldval, iRegL newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (CompareAndSwapL mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg_acq $res = $mem, $oldval, $newval\t# (long) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapNAcq(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set res (CompareAndSwapN mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw_acq $res = $mem, $oldval, $newval\t# (narrow oop) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct compareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n) && (n->as_LoadStore()->barrier_data() == 0));
|
||||||
|
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg_acq $res = $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ false, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapB(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (WeakCompareAndSwapB mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgb_weak $res = $mem, $oldval, $newval\t# (byte) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::byte, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapS(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (WeakCompareAndSwapS mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgs_weak $res = $mem, $oldval, $newval\t# (short) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::halfword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapI(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (WeakCompareAndSwapI mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw_weak $res = $mem, $oldval, $newval\t# (int) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapL(iRegINoSp res, indirect mem, iRegL oldval, iRegL newval, rFlagsReg cr) %{
|
||||||
|
match(Set res (WeakCompareAndSwapL mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg_weak $res = $mem, $oldval, $newval\t# (long) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapN(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
|
||||||
|
predicate(n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set res (WeakCompareAndSwapN mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw_weak $res = $mem, $oldval, $newval\t# (narrow oop) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, rFlagsReg cr) %{
|
||||||
|
predicate(n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg_weak $res = $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ false, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapBAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (WeakCompareAndSwapB mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgb_acq_weak $res = $mem, $oldval, $newval\t# (byte) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::byte, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapSAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (WeakCompareAndSwapS mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgs_acq_weak $res = $mem, $oldval, $newval\t# (short) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::halfword, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapIAcq(iRegINoSp res, indirect mem, iRegI oldval, iRegI newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (WeakCompareAndSwapI mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw_acq_weak $res = $mem, $oldval, $newval\t# (int) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapLAcq(iRegINoSp res, indirect mem, iRegL oldval, iRegL newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set res (WeakCompareAndSwapL mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg_acq_weak $res = $mem, $oldval, $newval\t# (long) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapNAcq(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set res (WeakCompareAndSwapN mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchgw_acq_weak $res = $mem, $oldval, $newval\t# (narrow oop) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::word, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct weakCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, rFlagsReg cr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n) && (n->as_LoadStore()->barrier_data() == 0));
|
||||||
|
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg_acq_weak $res = $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::xword, /*acquire*/ true, /*release*/ true,
|
||||||
|
/*weak*/ true, noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndSetI(indirect mem, iRegI newval, iRegINoSp oldval) %{
|
||||||
|
match(Set oldval (GetAndSetI mem newval));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchgw $oldval, $newval, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchgw($oldval$$Register, $newval$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndSetL(indirect mem, iRegL newval, iRegLNoSp oldval) %{
|
||||||
|
match(Set oldval (GetAndSetL mem newval));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchg $oldval, $newval, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchg($oldval$$Register, $newval$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndSetN(indirect mem, iRegN newval, iRegNNoSp oldval) %{
|
||||||
|
predicate(n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set oldval (GetAndSetN mem newval));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchgw $oldval, $newval, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchgw($oldval$$Register, $newval$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndSetP(indirect mem, iRegP newval, iRegPNoSp oldval) %{
|
||||||
|
predicate(n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set oldval (GetAndSetP mem newval));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchg $oldval, $newval, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchg($oldval$$Register, $newval$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndSetIAcq(indirect mem, iRegI newval, iRegINoSp oldval) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set oldval (GetAndSetI mem newval));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchgw_acq $oldval, $newval, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchgalw($oldval$$Register, $newval$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndSetLAcq(indirect mem, iRegL newval, iRegLNoSp oldval) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set oldval (GetAndSetL mem newval));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchg_acq $oldval, $newval, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchgal($oldval$$Register, $newval$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndSetNAcq(indirect mem, iRegN newval, iRegNNoSp oldval) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0);
|
||||||
|
match(Set oldval (GetAndSetN mem newval));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchgw_acq $oldval, $newval, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchgalw($oldval$$Register, $newval$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndSetPAcq(indirect mem, iRegP newval, iRegPNoSp oldval) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n) && (n->as_LoadStore()->barrier_data() == 0));
|
||||||
|
match(Set oldval (GetAndSetP mem newval));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchg_acq $oldval, $newval, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchgal($oldval$$Register, $newval$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddI(indirect mem, iRegINoSp newval, iRegIorL2I incr) %{
|
||||||
|
match(Set newval (GetAndAddI mem incr));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST+1);
|
||||||
|
format %{ "get_and_addI $newval, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addw($newval$$Register, $incr$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddIAcq(indirect mem, iRegINoSp newval, iRegIorL2I incr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set newval (GetAndAddI mem incr));
|
||||||
|
ins_cost(VOLATILE_REF_COST+1);
|
||||||
|
format %{ "get_and_addI_acq $newval, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addalw($newval$$Register, $incr$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddINoRes(indirect mem, Universe dummy, iRegIorL2I incr) %{
|
||||||
|
predicate(n->as_LoadStore()->result_not_used());
|
||||||
|
match(Set dummy (GetAndAddI mem incr));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
format %{ "get_and_addI noreg, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addw(noreg, $incr$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddIAcqNoRes(indirect mem, Universe dummy, iRegIorL2I incr) %{
|
||||||
|
predicate(n->as_LoadStore()->result_not_used() && needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set dummy (GetAndAddI mem incr));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
format %{ "get_and_addI_acq noreg, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addalw(noreg, $incr$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddIConst(indirect mem, iRegINoSp newval, immIAddSub incr) %{
|
||||||
|
match(Set newval (GetAndAddI mem incr));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST+1);
|
||||||
|
format %{ "get_and_addI $newval, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addw($newval$$Register, $incr$$constant, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddIAcqConst(indirect mem, iRegINoSp newval, immIAddSub incr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set newval (GetAndAddI mem incr));
|
||||||
|
ins_cost(VOLATILE_REF_COST+1);
|
||||||
|
format %{ "get_and_addI_acq $newval, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addalw($newval$$Register, $incr$$constant, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddINoResConst(indirect mem, Universe dummy, immIAddSub incr) %{
|
||||||
|
predicate(n->as_LoadStore()->result_not_used());
|
||||||
|
match(Set dummy (GetAndAddI mem incr));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
format %{ "get_and_addI noreg, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addw(noreg, $incr$$constant, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddIAcqNoResConst(indirect mem, Universe dummy, immIAddSub incr) %{
|
||||||
|
predicate(n->as_LoadStore()->result_not_used() && needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set dummy (GetAndAddI mem incr));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
format %{ "get_and_addI_acq noreg, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addalw(noreg, $incr$$constant, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddL(indirect mem, iRegLNoSp newval, iRegL incr) %{
|
||||||
|
match(Set newval (GetAndAddL mem incr));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST+1);
|
||||||
|
format %{ "get_and_addL $newval, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_add($newval$$Register, $incr$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddLAcq(indirect mem, iRegLNoSp newval, iRegL incr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set newval (GetAndAddL mem incr));
|
||||||
|
ins_cost(VOLATILE_REF_COST+1);
|
||||||
|
format %{ "get_and_addL_acq $newval, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addal($newval$$Register, $incr$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddLNoRes(indirect mem, Universe dummy, iRegL incr) %{
|
||||||
|
predicate(n->as_LoadStore()->result_not_used());
|
||||||
|
match(Set dummy (GetAndAddL mem incr));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
format %{ "get_and_addL noreg, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_add(noreg, $incr$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddLAcqNoRes(indirect mem, Universe dummy, iRegL incr) %{
|
||||||
|
predicate(n->as_LoadStore()->result_not_used() && needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set dummy (GetAndAddL mem incr));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
format %{ "get_and_addL_acq noreg, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addal(noreg, $incr$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddLConst(indirect mem, iRegLNoSp newval, immLAddSub incr) %{
|
||||||
|
match(Set newval (GetAndAddL mem incr));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST+1);
|
||||||
|
format %{ "get_and_addL $newval, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_add($newval$$Register, $incr$$constant, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddLAcqConst(indirect mem, iRegLNoSp newval, immLAddSub incr) %{
|
||||||
|
predicate(needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set newval (GetAndAddL mem incr));
|
||||||
|
ins_cost(VOLATILE_REF_COST+1);
|
||||||
|
format %{ "get_and_addL_acq $newval, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addal($newval$$Register, $incr$$constant, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddLNoResConst(indirect mem, Universe dummy, immLAddSub incr) %{
|
||||||
|
predicate(n->as_LoadStore()->result_not_used());
|
||||||
|
match(Set dummy (GetAndAddL mem incr));
|
||||||
|
ins_cost(2*VOLATILE_REF_COST);
|
||||||
|
format %{ "get_and_addL noreg, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_add(noreg, $incr$$constant, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
|
|
||||||
|
instruct getAndAddLAcqNoResConst(indirect mem, Universe dummy, immLAddSub incr) %{
|
||||||
|
predicate(n->as_LoadStore()->result_not_used() && needs_acquiring_load_exclusive(n));
|
||||||
|
match(Set dummy (GetAndAddL mem incr));
|
||||||
|
ins_cost(VOLATILE_REF_COST);
|
||||||
|
format %{ "get_and_addL_acq noreg, [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_addal(noreg, $incr$$constant, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}
|
||||||
246
src/hotspot/cpu/aarch64/aarch64_atomic_ad.m4
Normal file
246
src/hotspot/cpu/aarch64/aarch64_atomic_ad.m4
Normal file
@ -0,0 +1,246 @@
|
|||||||
|
// Copyright (c) 2020, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
|
// Copyright (c) 2016, 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.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
// BEGIN This file is automatically generated. Do not edit --------------
|
||||||
|
|
||||||
|
// Sundry CAS operations. Note that release is always true,
|
||||||
|
// regardless of the memory ordering of the CAS. This is because we
|
||||||
|
// need the volatile case to be sequentially consistent but there is
|
||||||
|
// no trailing StoreLoad barrier emitted by C2. Unfortunately we
|
||||||
|
// can't check the type of memory ordering here, so we always emit a
|
||||||
|
// STLXR.
|
||||||
|
|
||||||
|
// This section is generated from aarch64_atomic_ad.m4
|
||||||
|
|
||||||
|
dnl Return Arg1 with two spaces before it. We need this because m4
|
||||||
|
dnl strips leading spaces from macro args.
|
||||||
|
define(`INDENT', ` $1')dnl
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
dnl ====================== CompareAndExchange*
|
||||||
|
dnl
|
||||||
|
define(`CAE_INSN1',
|
||||||
|
`
|
||||||
|
instruct compareAndExchange$1$7(iReg$2NoSp res, indirect mem, iReg$2 oldval, iReg$2 newval, rFlagsReg cr) %{
|
||||||
|
ifelse($7,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),`dnl')
|
||||||
|
match(Set res (CompareAndExchange$1 mem (Binary oldval newval)));
|
||||||
|
ins_cost(`'ifelse($7,Acq,,2*)VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg$5`'ifelse($7,Acq,_acq,) $res = $mem, $oldval, $newval\t# ($3) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::$4, /*acquire*/ ifelse($7,Acq,true,false), /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
__ $6($res$$Register, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}')dnl
|
||||||
|
define(`CAE_INSN2',
|
||||||
|
`
|
||||||
|
instruct compareAndExchange$1$6(iReg$2NoSp res, indirect mem, iReg$2 oldval, iReg$2 newval, rFlagsReg cr) %{
|
||||||
|
ifelse($1$6,PAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && (n->as_LoadStore()->barrier_data() == 0));),
|
||||||
|
$1$6,NAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0);),
|
||||||
|
$1,P,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
||||||
|
$1,N,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
||||||
|
$6,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),
|
||||||
|
`dnl')
|
||||||
|
match(Set res (CompareAndExchange$1 mem (Binary oldval newval)));
|
||||||
|
ins_cost(`'ifelse($6,Acq,,2*)VOLATILE_REF_COST);
|
||||||
|
effect(TEMP_DEF res, KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg$5`'ifelse($6,Acq,_acq,) $res = $mem, $oldval, $newval\t# ($3) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::$4, /*acquire*/ ifelse($6,Acq,true,false), /*release*/ true,
|
||||||
|
/*weak*/ false, $res$$Register);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}')dnl
|
||||||
|
dnl
|
||||||
|
CAE_INSN1(B, I, byte, byte, b, sxtbw, )
|
||||||
|
CAE_INSN1(S, I, short, halfword, s, sxthw, )
|
||||||
|
CAE_INSN2(I, I, int, word, w, , )
|
||||||
|
CAE_INSN2(L, L, long, xword, , , )
|
||||||
|
CAE_INSN2(N, N, narrow oop, word, w, , )
|
||||||
|
CAE_INSN2(P, P, ptr, xword, , , )
|
||||||
|
dnl
|
||||||
|
CAE_INSN1(B, I, byte, byte, b, sxtbw, Acq)
|
||||||
|
CAE_INSN1(S, I, short, halfword, s, sxthw, Acq)
|
||||||
|
CAE_INSN2(I, I, int, word, w, Acq)
|
||||||
|
CAE_INSN2(L, L, long, xword, , Acq)
|
||||||
|
CAE_INSN2(N, N, narrow oop, word, w, Acq)
|
||||||
|
CAE_INSN2(P, P, ptr, xword, , Acq)
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
dnl ====================== (Weak)CompareAndSwap*
|
||||||
|
dnl
|
||||||
|
define(`CAS_INSN1',
|
||||||
|
`
|
||||||
|
instruct ifelse($7,Weak,'weakCompare`,'compare`)AndSwap$1$6(iRegINoSp res, indirect mem, iReg$2 oldval, iReg$2 newval, rFlagsReg cr) %{
|
||||||
|
ifelse($6,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),`dnl')
|
||||||
|
match(Set res ($7CompareAndSwap$1 mem (Binary oldval newval)));
|
||||||
|
ins_cost(`'ifelse($6,Acq,,2*)VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg$5`'ifelse($6,Acq,_acq,)`'ifelse($7,Weak,_weak) $res = $mem, $oldval, $newval\t# ($3) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::$4, /*acquire*/ ifelse($6,Acq,true,false), /*release*/ true,
|
||||||
|
/*weak*/ ifelse($7,Weak,true,false), noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}')dnl
|
||||||
|
dnl
|
||||||
|
define(`CAS_INSN2',
|
||||||
|
`
|
||||||
|
instruct ifelse($7,Weak,'weakCompare`,'compare`)AndSwap$1$6(iRegINoSp res, indirect mem, iReg$2 oldval, iReg$2 newval, rFlagsReg cr) %{
|
||||||
|
ifelse($1$6,PAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && (n->as_LoadStore()->barrier_data() == 0));),
|
||||||
|
$1$6,NAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0);),
|
||||||
|
$1,P,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
||||||
|
$1,N,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
||||||
|
$6,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),
|
||||||
|
`dnl')
|
||||||
|
match(Set res ($7CompareAndSwap$1 mem (Binary oldval newval)));
|
||||||
|
ins_cost(`'ifelse($6,Acq,,2*)VOLATILE_REF_COST);
|
||||||
|
effect(KILL cr);
|
||||||
|
format %{
|
||||||
|
"cmpxchg$5`'ifelse($6,Acq,_acq,)`'ifelse($7,Weak,_weak) $res = $mem, $oldval, $newval\t# ($3) if $mem == $oldval then $mem <-- $newval"
|
||||||
|
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
||||||
|
%}
|
||||||
|
ins_encode %{
|
||||||
|
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
||||||
|
Assembler::$4, /*acquire*/ ifelse($6,Acq,true,false), /*release*/ true,
|
||||||
|
/*weak*/ ifelse($7,Weak,true,false), noreg);
|
||||||
|
__ csetw($res$$Register, Assembler::EQ);
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_slow);
|
||||||
|
%}')dnl
|
||||||
|
dnl
|
||||||
|
CAS_INSN1(B, I, byte, byte, b, , )
|
||||||
|
CAS_INSN1(S, I, short, halfword, s, , )
|
||||||
|
CAS_INSN2(I, I, int, word, w, , )
|
||||||
|
CAS_INSN2(L, L, long, xword, , , )
|
||||||
|
CAS_INSN2(N, N, narrow oop, word, w, , )
|
||||||
|
CAS_INSN2(P, P, ptr, xword, , , )
|
||||||
|
dnl
|
||||||
|
CAS_INSN1(B, I, byte, byte, b, Acq, )
|
||||||
|
CAS_INSN1(S, I, short, halfword, s, Acq, )
|
||||||
|
CAS_INSN2(I, I, int, word, w, Acq, )
|
||||||
|
CAS_INSN2(L, L, long, xword, , Acq, )
|
||||||
|
CAS_INSN2(N, N, narrow oop, word, w, Acq, )
|
||||||
|
CAS_INSN2(P, P, ptr, xword, , Acq, )
|
||||||
|
dnl
|
||||||
|
CAS_INSN1(B, I, byte, byte, b, , Weak)
|
||||||
|
CAS_INSN1(S, I, short, halfword, s, , Weak)
|
||||||
|
CAS_INSN2(I, I, int, word, w, , Weak)
|
||||||
|
CAS_INSN2(L, L, long, xword, , , Weak)
|
||||||
|
CAS_INSN2(N, N, narrow oop, word, w, , Weak)
|
||||||
|
CAS_INSN2(P, P, ptr, xword, , , Weak)
|
||||||
|
dnl
|
||||||
|
CAS_INSN1(B, I, byte, byte, b, Acq, Weak)
|
||||||
|
CAS_INSN1(S, I, short, halfword, s, Acq, Weak)
|
||||||
|
CAS_INSN2(I, I, int, word, w, Acq, Weak)
|
||||||
|
CAS_INSN2(L, L, long, xword, , Acq, Weak)
|
||||||
|
CAS_INSN2(N, N, narrow oop, word, w, Acq, Weak)
|
||||||
|
CAS_INSN2(P, P, ptr, xword, , Acq, Weak)
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
dnl ====================== GetAndSet*
|
||||||
|
dnl
|
||||||
|
define(`GAS_INSN1',
|
||||||
|
`
|
||||||
|
instruct getAndSet$1$3(indirect mem, iReg$1 newval, iReg$1NoSp oldval) %{
|
||||||
|
ifelse($1$3,PAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && (n->as_LoadStore()->barrier_data() == 0));),
|
||||||
|
$1$3,NAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0);),
|
||||||
|
$1,P,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
||||||
|
$1,N,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
||||||
|
$3,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),
|
||||||
|
`dnl')
|
||||||
|
match(Set oldval (GetAndSet$1 mem newval));
|
||||||
|
ins_cost(`'ifelse($3,Acq,,2*)VOLATILE_REF_COST);
|
||||||
|
format %{ "atomic_xchg$2`'ifelse($3,Acq,_acq) $oldval, $newval, [$mem]" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_xchg`'ifelse($3,Acq,al)$2($oldval$$Register, $newval$$Register, as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}')dnl
|
||||||
|
dnl
|
||||||
|
GAS_INSN1(I, w, )
|
||||||
|
GAS_INSN1(L, , )
|
||||||
|
GAS_INSN1(N, w, )
|
||||||
|
GAS_INSN1(P, , )
|
||||||
|
dnl
|
||||||
|
GAS_INSN1(I, w, Acq)
|
||||||
|
GAS_INSN1(L, , Acq)
|
||||||
|
GAS_INSN1(N, w, Acq)
|
||||||
|
GAS_INSN1(P, , Acq)
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
dnl ====================== GetAndAdd*
|
||||||
|
dnl
|
||||||
|
define(`GAA_INSN1',
|
||||||
|
`
|
||||||
|
instruct getAndAdd$1$4$5$6(indirect mem, `'ifelse($5,NoRes,Universe dummy,iReg$1NoSp newval), `'ifelse($6,Const,imm$1AddSub incr,iReg$2 incr)) %{
|
||||||
|
ifelse($4$5,AcqNoRes,INDENT(predicate(n->as_LoadStore()->result_not_used() && needs_acquiring_load_exclusive(n));),
|
||||||
|
$5,NoRes,INDENT(predicate(n->as_LoadStore()->result_not_used());),
|
||||||
|
$4,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),
|
||||||
|
`dnl')
|
||||||
|
match(Set ifelse($5,NoRes,dummy,newval) (GetAndAdd$1 mem incr));
|
||||||
|
ins_cost(`'ifelse($4,Acq,,2*)VOLATILE_REF_COST`'ifelse($5,NoRes,,+1));
|
||||||
|
format %{ "get_and_add$1`'ifelse($4,Acq,_acq) `'ifelse($5,NoRes,noreg,$newval), [$mem], $incr" %}
|
||||||
|
ins_encode %{
|
||||||
|
__ atomic_add`'ifelse($4,Acq,al)$3(`'ifelse($5,NoRes,noreg,$newval$$Register), `'ifelse($6,Const,$incr$$constant,$incr$$Register), as_Register($mem$$base));
|
||||||
|
%}
|
||||||
|
ins_pipe(pipe_serial);
|
||||||
|
%}')dnl
|
||||||
|
dnl
|
||||||
|
dnl
|
||||||
|
GAA_INSN1(I, IorL2I, w, , , )
|
||||||
|
GAA_INSN1(I, IorL2I, w, Acq, , )
|
||||||
|
GAA_INSN1(I, IorL2I, w, , NoRes, )
|
||||||
|
GAA_INSN1(I, IorL2I, w, Acq, NoRes, )
|
||||||
|
GAA_INSN1(I, I, w, , , Const)
|
||||||
|
GAA_INSN1(I, I, w, Acq, , Const)
|
||||||
|
GAA_INSN1(I, I, w, , NoRes, Const)
|
||||||
|
GAA_INSN1(I, I, w, Acq, NoRes, Const)
|
||||||
|
dnl
|
||||||
|
GAA_INSN1(L, L, , , , )
|
||||||
|
GAA_INSN1(L, L, , Acq, , )
|
||||||
|
GAA_INSN1(L, L, , , NoRes, )
|
||||||
|
GAA_INSN1(L, L, , Acq, NoRes, )
|
||||||
|
GAA_INSN1(L, L, , , , Const)
|
||||||
|
GAA_INSN1(L, L, , Acq, , Const)
|
||||||
|
GAA_INSN1(L, L, , , NoRes, Const)
|
||||||
|
GAA_INSN1(L, L, , Acq, NoRes, Const)
|
||||||
|
dnl
|
||||||
@ -346,8 +346,14 @@ source %{
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect* vt) {
|
bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect* vt) {
|
||||||
// Only SVE has partial vector operations
|
// 1. Only SVE requires partial vector operations.
|
||||||
if (UseSVE == 0) {
|
// 2. The vector size in bytes must be smaller than MaxVectorSize.
|
||||||
|
// 3. Predicated vectors have a mask input, which guarantees that
|
||||||
|
// out-of-bounds lanes remain inactive.
|
||||||
|
int length_in_bytes = vt->length_in_bytes();
|
||||||
|
if (UseSVE == 0 ||
|
||||||
|
length_in_bytes == MaxVectorSize ||
|
||||||
|
node->is_predicated_vector()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -370,21 +376,22 @@ source %{
|
|||||||
return !node->in(1)->is_Con();
|
return !node->in(1)->is_Con();
|
||||||
case Op_LoadVector:
|
case Op_LoadVector:
|
||||||
case Op_StoreVector:
|
case Op_StoreVector:
|
||||||
// We use NEON load/store instructions if the vector length is <= 128 bits.
|
|
||||||
return vt->length_in_bytes() > 16;
|
|
||||||
case Op_AddReductionVI:
|
case Op_AddReductionVI:
|
||||||
case Op_AddReductionVL:
|
case Op_AddReductionVL:
|
||||||
// We may prefer using NEON instructions rather than SVE partial operations.
|
// For these ops, we prefer using NEON instructions rather than SVE
|
||||||
return !VM_Version::use_neon_for_vector(vt->length_in_bytes());
|
// predicated instructions for better performance.
|
||||||
|
return !VM_Version::use_neon_for_vector(length_in_bytes);
|
||||||
case Op_MinReductionV:
|
case Op_MinReductionV:
|
||||||
case Op_MaxReductionV:
|
case Op_MaxReductionV:
|
||||||
// For BYTE/SHORT/INT/FLOAT/DOUBLE types, we may prefer using NEON
|
// For BYTE/SHORT/INT/FLOAT/DOUBLE types, we prefer using NEON
|
||||||
// instructions rather than SVE partial operations.
|
// instructions rather than SVE predicated instructions for
|
||||||
|
// better performance.
|
||||||
return vt->element_basic_type() == T_LONG ||
|
return vt->element_basic_type() == T_LONG ||
|
||||||
!VM_Version::use_neon_for_vector(vt->length_in_bytes());
|
!VM_Version::use_neon_for_vector(length_in_bytes);
|
||||||
default:
|
default:
|
||||||
// For other ops whose vector size is smaller than the max vector size, a
|
// For other ops whose vector size is smaller than the max vector
|
||||||
// full-sized unpredicated operation does not impact the final vector result.
|
// size, a full-sized unpredicated operation does not impact the
|
||||||
|
// vector result.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -336,8 +336,14 @@ source %{
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect* vt) {
|
bool Matcher::vector_needs_partial_operations(Node* node, const TypeVect* vt) {
|
||||||
// Only SVE has partial vector operations
|
// 1. Only SVE requires partial vector operations.
|
||||||
if (UseSVE == 0) {
|
// 2. The vector size in bytes must be smaller than MaxVectorSize.
|
||||||
|
// 3. Predicated vectors have a mask input, which guarantees that
|
||||||
|
// out-of-bounds lanes remain inactive.
|
||||||
|
int length_in_bytes = vt->length_in_bytes();
|
||||||
|
if (UseSVE == 0 ||
|
||||||
|
length_in_bytes == MaxVectorSize ||
|
||||||
|
node->is_predicated_vector()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -360,21 +366,22 @@ source %{
|
|||||||
return !node->in(1)->is_Con();
|
return !node->in(1)->is_Con();
|
||||||
case Op_LoadVector:
|
case Op_LoadVector:
|
||||||
case Op_StoreVector:
|
case Op_StoreVector:
|
||||||
// We use NEON load/store instructions if the vector length is <= 128 bits.
|
|
||||||
return vt->length_in_bytes() > 16;
|
|
||||||
case Op_AddReductionVI:
|
case Op_AddReductionVI:
|
||||||
case Op_AddReductionVL:
|
case Op_AddReductionVL:
|
||||||
// We may prefer using NEON instructions rather than SVE partial operations.
|
// For these ops, we prefer using NEON instructions rather than SVE
|
||||||
return !VM_Version::use_neon_for_vector(vt->length_in_bytes());
|
// predicated instructions for better performance.
|
||||||
|
return !VM_Version::use_neon_for_vector(length_in_bytes);
|
||||||
case Op_MinReductionV:
|
case Op_MinReductionV:
|
||||||
case Op_MaxReductionV:
|
case Op_MaxReductionV:
|
||||||
// For BYTE/SHORT/INT/FLOAT/DOUBLE types, we may prefer using NEON
|
// For BYTE/SHORT/INT/FLOAT/DOUBLE types, we prefer using NEON
|
||||||
// instructions rather than SVE partial operations.
|
// instructions rather than SVE predicated instructions for
|
||||||
|
// better performance.
|
||||||
return vt->element_basic_type() == T_LONG ||
|
return vt->element_basic_type() == T_LONG ||
|
||||||
!VM_Version::use_neon_for_vector(vt->length_in_bytes());
|
!VM_Version::use_neon_for_vector(length_in_bytes);
|
||||||
default:
|
default:
|
||||||
// For other ops whose vector size is smaller than the max vector size, a
|
// For other ops whose vector size is smaller than the max vector
|
||||||
// full-sized unpredicated operation does not impact the final vector result.
|
// size, a full-sized unpredicated operation does not impact the
|
||||||
|
// vector result.
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 1997, 2019, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 1997, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -310,7 +310,18 @@ static void restore_live_registers(StubAssembler* sasm, bool restore_fpu_registe
|
|||||||
__ add(sp, sp, 32 * wordSize);
|
__ add(sp, sp, 32 * wordSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef R18_RESERVED
|
||||||
|
/*
|
||||||
|
Do not modify r18_tls when restoring registers if it is a reserved register. On Windows,
|
||||||
|
for example, r18_tls is used to store the pointer to the current thread's TEB (where TLS
|
||||||
|
variables are stored). Therefore, modifying r18_tls would corrupt the TEB pointer.
|
||||||
|
*/
|
||||||
|
__ pop(RegSet::range(r0, r17), sp);
|
||||||
|
__ ldp(zr, r19, Address(__ post(sp, 2 * wordSize)));
|
||||||
|
__ pop(RegSet::range(r20, r29), sp);
|
||||||
|
#else
|
||||||
__ pop(RegSet::range(r0, r29), sp);
|
__ pop(RegSet::range(r0, r29), sp);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void restore_live_registers_except_r0(StubAssembler* sasm, bool restore_fpu_registers = true) {
|
static void restore_live_registers_except_r0(StubAssembler* sasm, bool restore_fpu_registers = true) {
|
||||||
@ -323,8 +334,20 @@ static void restore_live_registers_except_r0(StubAssembler* sasm, bool restore_f
|
|||||||
__ add(sp, sp, 32 * wordSize);
|
__ add(sp, sp, 32 * wordSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef R18_RESERVED
|
||||||
|
/*
|
||||||
|
Do not modify r18_tls when restoring registers if it is a reserved register. On Windows,
|
||||||
|
for example, r18_tls is used to store the pointer to the current thread's TEB (where TLS
|
||||||
|
variables are stored). Therefore, modifying r18_tls would corrupt the TEB pointer.
|
||||||
|
*/
|
||||||
|
__ ldp(zr, r1, Address(__ post(sp, 2 * wordSize)));
|
||||||
|
__ pop(RegSet::range(r2, r17), sp);
|
||||||
|
__ ldp(zr, r19, Address(__ post(sp, 2 * wordSize)));
|
||||||
|
__ pop(RegSet::range(r20, r29), sp);
|
||||||
|
#else
|
||||||
__ ldp(zr, r1, Address(__ post(sp, 16)));
|
__ ldp(zr, r1, Address(__ post(sp, 16)));
|
||||||
__ pop(RegSet::range(r2, r29), sp);
|
__ pop(RegSet::range(r2, r29), sp);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -2547,26 +2547,22 @@ void C2_MacroAssembler::verify_int_in_range(uint idx, const TypeInt* t, Register
|
|||||||
if (t == TypeInt::INT) {
|
if (t == TypeInt::INT) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BLOCK_COMMENT("verify_int_in_range {");
|
BLOCK_COMMENT("verify_int_in_range {");
|
||||||
Label L_success, L_failure;
|
Label L_success, L_failure;
|
||||||
|
|
||||||
jint lo = t->_lo;
|
jint lo = t->_lo;
|
||||||
jint hi = t->_hi;
|
jint hi = t->_hi;
|
||||||
|
|
||||||
if (lo != min_jint && hi != max_jint) {
|
if (lo != min_jint) {
|
||||||
subsw(rtmp, rval, lo);
|
subsw(rtmp, rval, lo);
|
||||||
br(Assembler::LT, L_failure);
|
br(Assembler::LT, L_failure);
|
||||||
subsw(rtmp, rval, hi);
|
|
||||||
br(Assembler::LE, L_success);
|
|
||||||
} else if (lo != min_jint) {
|
|
||||||
subsw(rtmp, rval, lo);
|
|
||||||
br(Assembler::GE, L_success);
|
|
||||||
} else if (hi != max_jint) {
|
|
||||||
subsw(rtmp, rval, hi);
|
|
||||||
br(Assembler::LE, L_success);
|
|
||||||
} else {
|
|
||||||
ShouldNotReachHere();
|
|
||||||
}
|
}
|
||||||
|
if (hi != max_jint) {
|
||||||
|
subsw(rtmp, rval, hi);
|
||||||
|
br(Assembler::GT, L_failure);
|
||||||
|
}
|
||||||
|
b(L_success);
|
||||||
|
|
||||||
bind(L_failure);
|
bind(L_failure);
|
||||||
movw(c_rarg0, idx);
|
movw(c_rarg0, idx);
|
||||||
@ -2590,26 +2586,22 @@ void C2_MacroAssembler::verify_long_in_range(uint idx, const TypeLong* t, Regist
|
|||||||
if (t == TypeLong::LONG) {
|
if (t == TypeLong::LONG) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BLOCK_COMMENT("verify_long_in_range {");
|
BLOCK_COMMENT("verify_long_in_range {");
|
||||||
Label L_success, L_failure;
|
Label L_success, L_failure;
|
||||||
|
|
||||||
jlong lo = t->_lo;
|
jlong lo = t->_lo;
|
||||||
jlong hi = t->_hi;
|
jlong hi = t->_hi;
|
||||||
|
|
||||||
if (lo != min_jlong && hi != max_jlong) {
|
if (lo != min_jlong) {
|
||||||
subs(rtmp, rval, lo);
|
subs(rtmp, rval, lo);
|
||||||
br(Assembler::LT, L_failure);
|
br(Assembler::LT, L_failure);
|
||||||
subs(rtmp, rval, hi);
|
|
||||||
br(Assembler::LE, L_success);
|
|
||||||
} else if (lo != min_jlong) {
|
|
||||||
subs(rtmp, rval, lo);
|
|
||||||
br(Assembler::GE, L_success);
|
|
||||||
} else if (hi != max_jlong) {
|
|
||||||
subs(rtmp, rval, hi);
|
|
||||||
br(Assembler::LE, L_success);
|
|
||||||
} else {
|
|
||||||
ShouldNotReachHere();
|
|
||||||
}
|
}
|
||||||
|
if (hi != max_jlong) {
|
||||||
|
subs(rtmp, rval, hi);
|
||||||
|
br(Assembler::GT, L_failure);
|
||||||
|
}
|
||||||
|
b(L_success);
|
||||||
|
|
||||||
bind(L_failure);
|
bind(L_failure);
|
||||||
movw(c_rarg0, idx);
|
movw(c_rarg0, idx);
|
||||||
|
|||||||
@ -1,161 +0,0 @@
|
|||||||
dnl Copyright (c) 2016, 2021, Red Hat Inc. All rights reserved.
|
|
||||||
dnl DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
|
||||||
dnl
|
|
||||||
dnl This code is free software; you can redistribute it and/or modify it
|
|
||||||
dnl under the terms of the GNU General Public License version 2 only, as
|
|
||||||
dnl published by the Free Software Foundation.
|
|
||||||
dnl
|
|
||||||
dnl This code is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
dnl ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
dnl FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
dnl version 2 for more details (a copy is included in the LICENSE file that
|
|
||||||
dnl accompanied this code).
|
|
||||||
dnl
|
|
||||||
dnl You should have received a copy of the GNU General Public License version
|
|
||||||
dnl 2 along with this work; if not, write to the Free Software Foundation,
|
|
||||||
dnl Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
||||||
dnl
|
|
||||||
dnl Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
|
|
||||||
dnl or visit www.oracle.com if you need additional information or have any
|
|
||||||
dnl questions.
|
|
||||||
dnl
|
|
||||||
dnl
|
|
||||||
dnl Process this file with m4 cas.m4 to generate the CAE and wCAS
|
|
||||||
dnl instructions used in aarch64.ad.
|
|
||||||
dnl
|
|
||||||
|
|
||||||
// BEGIN This section of the file is automatically generated. Do not edit --------------
|
|
||||||
|
|
||||||
// Sundry CAS operations. Note that release is always true,
|
|
||||||
// regardless of the memory ordering of the CAS. This is because we
|
|
||||||
// need the volatile case to be sequentially consistent but there is
|
|
||||||
// no trailing StoreLoad barrier emitted by C2. Unfortunately we
|
|
||||||
// can't check the type of memory ordering here, so we always emit a
|
|
||||||
// STLXR.
|
|
||||||
|
|
||||||
// This section is generated from cas.m4
|
|
||||||
|
|
||||||
dnl Return Arg1 with two spaces before it. We need this because m4
|
|
||||||
dnl strips leading spaces from macro args.
|
|
||||||
define(`INDENT', ` $1')dnl
|
|
||||||
dnl
|
|
||||||
define(`CAS_INSN',
|
|
||||||
`
|
|
||||||
// This pattern is generated automatically from cas.m4.
|
|
||||||
// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
|
|
||||||
instruct compareAndExchange$1$6(iReg$2NoSp res, indirect mem, iReg$2 oldval, iReg$2 newval, rFlagsReg cr) %{
|
|
||||||
ifelse($1$6,PAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && (n->as_LoadStore()->barrier_data() == 0));),
|
|
||||||
$1$6,NAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0);),
|
|
||||||
$1,P,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
|
||||||
$1,N,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
|
||||||
$6,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),
|
|
||||||
`dnl')
|
|
||||||
match(Set res (CompareAndExchange$1 mem (Binary oldval newval)));
|
|
||||||
ifelse($6,Acq,'ins_cost(VOLATILE_REF_COST);`,'ins_cost(2 * VOLATILE_REF_COST);`)
|
|
||||||
effect(TEMP_DEF res, KILL cr);
|
|
||||||
format %{
|
|
||||||
"cmpxchg$5`'ifelse($6,Acq,_acq,) $res = $mem, $oldval, $newval\t# ($3, weak) if $mem == $oldval then $mem <-- $newval"
|
|
||||||
%}
|
|
||||||
ins_encode %{
|
|
||||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
|
||||||
Assembler::$4, /*acquire*/ ifelse($6,Acq,true,false), /*release*/ true,
|
|
||||||
/*weak*/ false, $res$$Register);
|
|
||||||
%}
|
|
||||||
ins_pipe(pipe_slow);
|
|
||||||
%}')dnl
|
|
||||||
define(`CAS_INSN4',
|
|
||||||
`
|
|
||||||
// This pattern is generated automatically from cas.m4.
|
|
||||||
// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
|
|
||||||
instruct compareAndExchange$1$7(iReg$2NoSp res, indirect mem, iReg$2 oldval, iReg$2 newval, rFlagsReg cr) %{
|
|
||||||
ifelse($7,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),`dnl')
|
|
||||||
match(Set res (CompareAndExchange$1 mem (Binary oldval newval)));
|
|
||||||
ifelse($7,Acq,'ins_cost(VOLATILE_REF_COST);`,'ins_cost(2 * VOLATILE_REF_COST);`)
|
|
||||||
effect(TEMP_DEF res, KILL cr);
|
|
||||||
format %{
|
|
||||||
"cmpxchg$5`'ifelse($7,Acq,_acq,) $res = $mem, $oldval, $newval\t# ($3, weak) if $mem == $oldval then $mem <-- $newval"
|
|
||||||
%}
|
|
||||||
ins_encode %{
|
|
||||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
|
||||||
Assembler::$4, /*acquire*/ ifelse($7,Acq,true,false), /*release*/ true,
|
|
||||||
/*weak*/ false, $res$$Register);
|
|
||||||
__ $6($res$$Register, $res$$Register);
|
|
||||||
%}
|
|
||||||
ins_pipe(pipe_slow);
|
|
||||||
%}')dnl
|
|
||||||
CAS_INSN4(B,I,byte,byte,b,sxtbw)
|
|
||||||
CAS_INSN4(S,I,short,halfword,s,sxthw)
|
|
||||||
CAS_INSN(I,I,int,word,w)
|
|
||||||
CAS_INSN(L,L,long,xword)
|
|
||||||
CAS_INSN(N,N,narrow oop,word,w)
|
|
||||||
CAS_INSN(P,P,ptr,xword)
|
|
||||||
dnl
|
|
||||||
CAS_INSN4(B,I,byte,byte,b,sxtbw,Acq)
|
|
||||||
CAS_INSN4(S,I,short,halfword,s,sxthw,Acq)
|
|
||||||
CAS_INSN(I,I,int,word,w,Acq)
|
|
||||||
CAS_INSN(L,L,long,xword,,Acq)
|
|
||||||
CAS_INSN(N,N,narrow oop,word,w,Acq)
|
|
||||||
CAS_INSN(P,P,ptr,xword,,Acq)
|
|
||||||
dnl
|
|
||||||
define(`CAS_INSN2',
|
|
||||||
`
|
|
||||||
// This pattern is generated automatically from cas.m4.
|
|
||||||
// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
|
|
||||||
instruct weakCompareAndSwap$1$6(iRegINoSp res, indirect mem, iReg$2 oldval, iReg$2 newval, rFlagsReg cr) %{
|
|
||||||
ifelse($6,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),`dnl')
|
|
||||||
match(Set res (WeakCompareAndSwap$1 mem (Binary oldval newval)));
|
|
||||||
ifelse($6,Acq,'ins_cost(VOLATILE_REF_COST);`,'ins_cost(2 * VOLATILE_REF_COST);`)
|
|
||||||
effect(KILL cr);
|
|
||||||
format %{
|
|
||||||
"cmpxchg$5`'ifelse($6,Acq,_acq,) $res = $mem, $oldval, $newval\t# ($3, weak) if $mem == $oldval then $mem <-- $newval"
|
|
||||||
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
|
||||||
%}
|
|
||||||
ins_encode %{
|
|
||||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
|
||||||
Assembler::$4, /*acquire*/ ifelse($6,Acq,true,false), /*release*/ true,
|
|
||||||
/*weak*/ true, noreg);
|
|
||||||
__ csetw($res$$Register, Assembler::EQ);
|
|
||||||
%}
|
|
||||||
ins_pipe(pipe_slow);
|
|
||||||
%}')dnl
|
|
||||||
define(`CAS_INSN3',
|
|
||||||
`
|
|
||||||
// This pattern is generated automatically from cas.m4.
|
|
||||||
// DO NOT EDIT ANYTHING IN THIS SECTION OF THE FILE
|
|
||||||
instruct weakCompareAndSwap$1$6(iRegINoSp res, indirect mem, iReg$2 oldval, iReg$2 newval, rFlagsReg cr) %{
|
|
||||||
ifelse($1$6,PAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && (n->as_LoadStore()->barrier_data() == 0));),
|
|
||||||
$1$6,NAcq,INDENT(predicate(needs_acquiring_load_exclusive(n) && n->as_LoadStore()->barrier_data() == 0);),
|
|
||||||
$1,P,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
|
||||||
$1,N,INDENT(predicate(n->as_LoadStore()->barrier_data() == 0);),
|
|
||||||
$6,Acq,INDENT(predicate(needs_acquiring_load_exclusive(n));),
|
|
||||||
`dnl')
|
|
||||||
match(Set res (WeakCompareAndSwap$1 mem (Binary oldval newval)));
|
|
||||||
ifelse($6,Acq,'ins_cost(VOLATILE_REF_COST);`,'ins_cost(2 * VOLATILE_REF_COST);`)
|
|
||||||
effect(KILL cr);
|
|
||||||
format %{
|
|
||||||
"cmpxchg$5`'ifelse($6,Acq,_acq,) $res = $mem, $oldval, $newval\t# ($3, weak) if $mem == $oldval then $mem <-- $newval"
|
|
||||||
"csetw $res, EQ\t# $res <-- (EQ ? 1 : 0)"
|
|
||||||
%}
|
|
||||||
ins_encode %{
|
|
||||||
__ cmpxchg($mem$$Register, $oldval$$Register, $newval$$Register,
|
|
||||||
Assembler::$4, /*acquire*/ ifelse($6,Acq,true,false), /*release*/ true,
|
|
||||||
/*weak*/ true, noreg);
|
|
||||||
__ csetw($res$$Register, Assembler::EQ);
|
|
||||||
%}
|
|
||||||
ins_pipe(pipe_slow);
|
|
||||||
%}')dnl
|
|
||||||
CAS_INSN2(B,I,byte,byte,b)
|
|
||||||
CAS_INSN2(S,I,short,halfword,s)
|
|
||||||
CAS_INSN3(I,I,int,word,w)
|
|
||||||
CAS_INSN3(L,L,long,xword)
|
|
||||||
CAS_INSN3(N,N,narrow oop,word,w)
|
|
||||||
CAS_INSN3(P,P,ptr,xword)
|
|
||||||
CAS_INSN2(B,I,byte,byte,b,Acq)
|
|
||||||
CAS_INSN2(S,I,short,halfword,s,Acq)
|
|
||||||
CAS_INSN3(I,I,int,word,w,Acq)
|
|
||||||
CAS_INSN3(L,L,long,xword,,Acq)
|
|
||||||
CAS_INSN3(N,N,narrow oop,word,w,Acq)
|
|
||||||
CAS_INSN3(P,P,ptr,xword,,Acq)
|
|
||||||
dnl
|
|
||||||
|
|
||||||
// END This section of the file is automatically generated. Do not edit --------------
|
|
||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2022, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2022, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
|
// Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
//
|
//
|
||||||
// This code is free software; you can redistribute it and/or modify it
|
// This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2023, 2025, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2023, 2026, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -23,13 +23,13 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdlib.h> // do not reorder
|
#include "cppstdlib/cstdlib.hpp"
|
||||||
#include <stdint.h> // do not reorder
|
|
||||||
|
|
||||||
#include "immediate_aarch64.hpp"
|
#include "immediate_aarch64.hpp"
|
||||||
#include "metaprogramming/primitiveConversions.hpp"
|
#include "metaprogramming/primitiveConversions.hpp"
|
||||||
#include "utilities/globalDefinitions.hpp"
|
#include "utilities/globalDefinitions.hpp"
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
// there are at most 2^13 possible logical immediate encodings
|
// there are at most 2^13 possible logical immediate encodings
|
||||||
// however, some combinations of immr and imms are invalid
|
// however, some combinations of immr and imms are invalid
|
||||||
static const unsigned LI_TABLE_SIZE = (1 << 13);
|
static const unsigned LI_TABLE_SIZE = (1 << 13);
|
||||||
|
|||||||
@ -1,4 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
|
* Copyright (c) 2025, 2026, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
@ -22,10 +23,10 @@
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _IMMEDIATE_H
|
#ifndef CPU_AARCH64_IMMEDIATE_AARCH64_HPP
|
||||||
#define _IMMEDIATE_H
|
#define CPU_AARCH64_IMMEDIATE_AARCH64_HPP
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* functions to map backwards and forwards between logical or floating
|
* functions to map backwards and forwards between logical or floating
|
||||||
@ -51,4 +52,4 @@ uint32_t encoding_for_logical_immediate(uint64_t immediate);
|
|||||||
uint64_t fp_immediate_for_encoding(uint32_t imm8, int is_dp);
|
uint64_t fp_immediate_for_encoding(uint32_t imm8, int is_dp);
|
||||||
uint32_t encoding_for_fp_immediate(float immediate);
|
uint32_t encoding_for_fp_immediate(float immediate);
|
||||||
|
|
||||||
#endif // _IMMEDIATE_H
|
#endif // CPU_AARCH64_IMMEDIATE_AARCH64_HPP
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2002, 2023, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2002, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -5379,7 +5379,6 @@ void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
|
|||||||
assert (UseCompressedClassPointers, "should only be used for compressed headers");
|
assert (UseCompressedClassPointers, "should only be used for compressed headers");
|
||||||
assert (oop_recorder() != nullptr, "this assembler needs an OopRecorder");
|
assert (oop_recorder() != nullptr, "this assembler needs an OopRecorder");
|
||||||
int index = oop_recorder()->find_index(k);
|
int index = oop_recorder()->find_index(k);
|
||||||
assert(! Universe::heap()->is_in(k), "should not be an oop");
|
|
||||||
|
|
||||||
InstructionMark im(this);
|
InstructionMark im(this);
|
||||||
RelocationHolder rspec = metadata_Relocation::spec(index);
|
RelocationHolder rspec = metadata_Relocation::spec(index);
|
||||||
@ -6260,14 +6259,10 @@ void MacroAssembler::fill_words(Register base, Register cnt, Register value)
|
|||||||
|
|
||||||
// Intrinsic for
|
// Intrinsic for
|
||||||
//
|
//
|
||||||
// - sun.nio.cs.ISO_8859_1.Encoder#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
|
// - sun/nio/cs/ISO_8859_1$Encoder.implEncodeISOArray
|
||||||
// Encodes char[] to byte[] in ISO-8859-1
|
// return the number of characters copied.
|
||||||
//
|
// - java/lang/StringUTF16.compress
|
||||||
// - java.lang.StringCoding#encodeISOArray0(byte[] sa, int sp, byte[] da, int dp, int len)
|
// return index of non-latin1 character if copy fails, otherwise 'len'.
|
||||||
// Encodes byte[] (containing UTF-16) to byte[] in ISO-8859-1
|
|
||||||
//
|
|
||||||
// - java.lang.StringCoding#encodeAsciiArray0(char[] sa, int sp, byte[] da, int dp, int len)
|
|
||||||
// Encodes char[] to byte[] in ASCII
|
|
||||||
//
|
//
|
||||||
// This version always returns the number of characters copied, and does not
|
// This version always returns the number of characters copied, and does not
|
||||||
// clobber the 'len' register. A successful copy will complete with the post-
|
// clobber the 'len' register. A successful copy will complete with the post-
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2010, 2022, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2010, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2000, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, 2021, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, 2021, Red Hat Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
|
|||||||
@ -85,7 +85,7 @@ void Relocation::pd_set_call_destination(address x) {
|
|||||||
} else {
|
} else {
|
||||||
MacroAssembler::pd_patch_instruction(addr(), x);
|
MacroAssembler::pd_patch_instruction(addr(), x);
|
||||||
}
|
}
|
||||||
assert(pd_call_destination(addr()) == x, "fail in reloc");
|
guarantee(pd_call_destination(addr()) == x, "fail in reloc");
|
||||||
}
|
}
|
||||||
|
|
||||||
void trampoline_stub_Relocation::pd_fix_owner_after_move() {
|
void trampoline_stub_Relocation::pd_fix_owner_after_move() {
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2003, 2025, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2003, 2026, Oracle and/or its affiliates. All rights reserved.
|
||||||
* Copyright (c) 2014, 2021, Red Hat Inc. All rights reserved.
|
* Copyright (c) 2014, 2021, Red Hat Inc. All rights reserved.
|
||||||
* Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
|
* Copyright (c) 2021, Azul Systems, Inc. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
@ -722,22 +722,20 @@ void SharedRuntime::generate_i2c2i_adapters(MacroAssembler *masm,
|
|||||||
|
|
||||||
// Class initialization barrier for static methods
|
// Class initialization barrier for static methods
|
||||||
entry_address[AdapterBlob::C2I_No_Clinit_Check] = nullptr;
|
entry_address[AdapterBlob::C2I_No_Clinit_Check] = nullptr;
|
||||||
if (VM_Version::supports_fast_class_init_checks()) {
|
assert(VM_Version::supports_fast_class_init_checks(), "sanity");
|
||||||
Label L_skip_barrier;
|
Label L_skip_barrier;
|
||||||
|
|
||||||
{ // Bypass the barrier for non-static methods
|
// Bypass the barrier for non-static methods
|
||||||
__ ldrh(rscratch1, Address(rmethod, Method::access_flags_offset()));
|
__ ldrh(rscratch1, Address(rmethod, Method::access_flags_offset()));
|
||||||
__ andsw(zr, rscratch1, JVM_ACC_STATIC);
|
__ andsw(zr, rscratch1, JVM_ACC_STATIC);
|
||||||
__ br(Assembler::EQ, L_skip_barrier); // non-static
|
__ br(Assembler::EQ, L_skip_barrier); // non-static
|
||||||
}
|
|
||||||
|
|
||||||
__ load_method_holder(rscratch2, rmethod);
|
__ load_method_holder(rscratch2, rmethod);
|
||||||
__ clinit_barrier(rscratch2, rscratch1, &L_skip_barrier);
|
__ clinit_barrier(rscratch2, rscratch1, &L_skip_barrier);
|
||||||
__ far_jump(RuntimeAddress(SharedRuntime::get_handle_wrong_method_stub()));
|
__ far_jump(RuntimeAddress(SharedRuntime::get_handle_wrong_method_stub()));
|
||||||
|
|
||||||
__ bind(L_skip_barrier);
|
__ bind(L_skip_barrier);
|
||||||
entry_address[AdapterBlob::C2I_No_Clinit_Check] = __ pc();
|
entry_address[AdapterBlob::C2I_No_Clinit_Check] = __ pc();
|
||||||
}
|
|
||||||
|
|
||||||
BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
|
BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
|
||||||
bs->c2i_entry_barrier(masm);
|
bs->c2i_entry_barrier(masm);
|
||||||
@ -1508,7 +1506,8 @@ nmethod* SharedRuntime::generate_native_wrapper(MacroAssembler* masm,
|
|||||||
// SVC, HVC, or SMC. Make it a NOP.
|
// SVC, HVC, or SMC. Make it a NOP.
|
||||||
__ nop();
|
__ nop();
|
||||||
|
|
||||||
if (VM_Version::supports_fast_class_init_checks() && method->needs_clinit_barrier()) {
|
if (method->needs_clinit_barrier()) {
|
||||||
|
assert(VM_Version::supports_fast_class_init_checks(), "sanity");
|
||||||
Label L_skip_barrier;
|
Label L_skip_barrier;
|
||||||
__ mov_metadata(rscratch2, method->method_holder()); // InstanceKlass*
|
__ mov_metadata(rscratch2, method->method_holder()); // InstanceKlass*
|
||||||
__ clinit_barrier(rscratch2, rscratch1, &L_skip_barrier);
|
__ clinit_barrier(rscratch2, rscratch1, &L_skip_barrier);
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (c) 2019, 2024, Oracle and/or its affiliates. All rights reserved.
|
* Copyright (c) 2019, 2025, Oracle and/or its affiliates. All rights reserved.
|
||||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||||
*
|
*
|
||||||
* This code is free software; you can redistribute it and/or modify it
|
* This code is free software; you can redistribute it and/or modify it
|
||||||
|
|||||||
@ -2879,7 +2879,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// Inputs:
|
// Inputs:
|
||||||
// c_rarg0 - source byte array address
|
// c_rarg0 - source byte array address
|
||||||
// c_rarg1 - destination byte array address
|
// c_rarg1 - destination byte array address
|
||||||
// c_rarg2 - K (key) in little endian int array
|
// c_rarg2 - sessionKe (key) in little endian int array
|
||||||
//
|
//
|
||||||
address generate_aescrypt_encryptBlock() {
|
address generate_aescrypt_encryptBlock() {
|
||||||
__ align(CodeEntryAlignment);
|
__ align(CodeEntryAlignment);
|
||||||
@ -2912,7 +2912,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// Inputs:
|
// Inputs:
|
||||||
// c_rarg0 - source byte array address
|
// c_rarg0 - source byte array address
|
||||||
// c_rarg1 - destination byte array address
|
// c_rarg1 - destination byte array address
|
||||||
// c_rarg2 - K (key) in little endian int array
|
// c_rarg2 - sessionKd (key) in little endian int array
|
||||||
//
|
//
|
||||||
address generate_aescrypt_decryptBlock() {
|
address generate_aescrypt_decryptBlock() {
|
||||||
assert(UseAES, "need AES cryptographic extension support");
|
assert(UseAES, "need AES cryptographic extension support");
|
||||||
@ -2946,7 +2946,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// Inputs:
|
// Inputs:
|
||||||
// c_rarg0 - source byte array address
|
// c_rarg0 - source byte array address
|
||||||
// c_rarg1 - destination byte array address
|
// c_rarg1 - destination byte array address
|
||||||
// c_rarg2 - K (key) in little endian int array
|
// c_rarg2 - sessionKe (key) in little endian int array
|
||||||
// c_rarg3 - r vector byte array address
|
// c_rarg3 - r vector byte array address
|
||||||
// c_rarg4 - input length
|
// c_rarg4 - input length
|
||||||
//
|
//
|
||||||
@ -3051,7 +3051,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// Inputs:
|
// Inputs:
|
||||||
// c_rarg0 - source byte array address
|
// c_rarg0 - source byte array address
|
||||||
// c_rarg1 - destination byte array address
|
// c_rarg1 - destination byte array address
|
||||||
// c_rarg2 - K (key) in little endian int array
|
// c_rarg2 - sessionKd (key) in little endian int array
|
||||||
// c_rarg3 - r vector byte array address
|
// c_rarg3 - r vector byte array address
|
||||||
// c_rarg4 - input length
|
// c_rarg4 - input length
|
||||||
//
|
//
|
||||||
@ -3178,7 +3178,7 @@ class StubGenerator: public StubCodeGenerator {
|
|||||||
// Inputs:
|
// Inputs:
|
||||||
// c_rarg0 - source byte array address
|
// c_rarg0 - source byte array address
|
||||||
// c_rarg1 - destination byte array address
|
// c_rarg1 - destination byte array address
|
||||||
// c_rarg2 - K (key) in little endian int array
|
// c_rarg2 - sessionKe (key) in little endian int array
|
||||||
// c_rarg3 - counter vector byte array address
|
// c_rarg3 - counter vector byte array address
|
||||||
// c_rarg4 - input length
|
// c_rarg4 - input length
|
||||||
// c_rarg5 - saved encryptedCounter start
|
// c_rarg5 - saved encryptedCounter start
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user